|
程序如下:
! [! {' m! R4 l0 \) v) f
! J3 Q% `& K" y0 B5 W/ s操作系統(tǒng): win7 64位1 K, p7 b# Q, R9 i; i4 T" l
IDE:VC++2010旗艦版
- t' O" V! F4 \$ Z0 ]9 j8 y. g視覺軟件: OPENCV 3.0
# @( K( G1 E6 h' j: @/ b
3 v+ a. y8 c1 ^$ S9 n4 B/ o- @" B0 m0 r4 T: _$ p$ E. o. c
//#include "stdafx.h", B8 [- l4 ]/ u. g9 Q% ]
#include "core/core.hpp"
5 A: t8 a- d* J+ }1 J) C#include <opencv2/imgproc/imgproc.hpp>
" C8 k' j0 {* ]9 [* [#include <opencv2/highgui/highgui.hpp>+ x& H0 ^1 M7 C& |9 [! @: `8 @! e* r
#include <iostream>/ l) o5 b5 t7 M! q! q; s
#include "highgui.h"5 ?+ q/ ?, a: U; @+ D, ~4 X, n1 K7 r: ?
#include <set>2 A# h3 o8 n9 I/ a$ V$ l
#include <opencv2\opencv.hpp>; R }/ N* U. g$ u% s
#include<vector> //包含所需要的類文件vector,還有一定要加上using namespace std。
! ^1 ?7 G% H( i$ A3 c/ v- b#include <stdio.h>
3 e# P4 G/ B z I6 N#include <conio.h>
8 G7 A$ C& C+ \; J5 S( J#include <opencv2/highgui/highgui_c.h>$ S% L9 d+ L. N$ }3 e
#include <math.h>
9 D% K9 e$ T. D o0 z% f, ?#include "iostream"
0 N0 V: O$ v& }$ }#include "cv.h"/ U6 M2 G; A7 \
#include "highgui.h"
$ z6 j5 J* f) p$ Z" E0 pusing namespace std;
+ q2 j" R8 D4 I9 A8 tusing namespace cv;
4 V* ~5 T j7 a2 [, `- V+ Z! n& B% k& U5 K! l( [ y. b
! @! G5 g; R9 W
1 z H2 |7 c' k//-----------------------------------【main( )函數(shù)】--------------------------------------------
# s i" V3 A! d: @. l// 描述:控制臺應(yīng)用程序的入口函數(shù),我們的程序從這里開始0 W* _1 ~" G+ B9 A) b
//-------------------------------------------------------------------------------------------------" u( \+ [5 A7 F3 b! L
/ o* b+ d: S2 v6 p9 lint main()
' l7 A! g" q- {3 K' r' B& J9 x
9 E0 w6 k( {# K G1 F9 H{; { K j# [/ a# r
int chufa=1;
; T8 H) _- B2 T //【1】從攝像頭讀入視頻# r B- V* x; J. N( c
0 z. m0 O% Z4 }9 { VideoCapture capture(0);
7 P: U, J% U* G, {
* o. l$ c; L; C* p Mat edges; //定義類! Z' x4 g7 W# G
8 ^2 f9 P: ]: A. i# y/ NnamedWindow("預(yù)處理后的視頻", 0);
* Y, b& w% d# _, ~
: k3 R( }# }) G. g4 g // Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項(xiàng)至于循環(huán)之外,不要重復(fù)定義Mat,增快速度;
1 m: X5 E4 z! D9 u; B. V
8 P6 z7 A5 V$ g//定義輪廓和層次結(jié)構(gòu)(這個不是很理解)% g* [' r$ b8 U Q7 u$ b* n) g, s( f
9 ?5 c# R0 N) n$ n: h6 b//vector<vector<Point>>contours; //其中contours 應(yīng)該是一個變量,可以用在后面的輪廓查找的函數(shù)中,定義點(diǎn)的向量
R$ S4 Z/ D, S4 U( j
+ C8 T* E1 U# y2 F5 |! u//vector<Vec4i>hierarchy; //定義四維向量???
- [& f& T: H# \( m% A$ A
j5 E# a1 }6 R3 E! v) ]+ M//【2】循環(huán)顯示每一幀
, H5 ]% r! }, l- m0 W2 K' y/ ?2 m. x/ c, u6 ?5 X* y5 V9 h
while (1)
* s6 R7 O, J# ^3 j, ?3 P5 L1 a/ C( _7 c1 o
{% d' R3 k& m, }( B% Q6 P
; f. Y" Y0 h, \# f6 }* } //讀入圖像4 o4 t$ F7 E- F5 q! N$ n% @
+ Z1 y4 A5 o7 |. i& m% @- Z( x! R
Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項(xiàng)至于循環(huán)之外,不要重復(fù)定義Mat,增快速度;2 z4 B0 }/ R9 X: c. E+ u& q
/ w: q8 G, z1 J& M" s" V
if (chufa=1) //當(dāng)取樣信號為1時,開始取當(dāng)前幀,然后進(jìn)行識別
" r& Y; q+ C6 D4 U+ I
; h' @0 K# b# K- ?3 a3 v$ _ {
/ j: f/ g/ w7 T- f, u' e9 b
8 z5 e! O2 Q1 ?/ `, X capture >> frame; //讀取當(dāng)前幀,videocapture函數(shù)是不斷讀取外界的視頻,需要一個類來讀取當(dāng)前幀,
* q: E) D8 G% e" s3 G+ U chufa=0;
6 l6 J5 W5 v9 z: L1 z8 e0 j
* G- Y$ {5 E* c" j; s //對于只需要一副圖片來進(jìn)行檢測的操作來說,每個循環(huán)只要出發(fā)某個取樣信號,取樣一次就好了。因此用IF語句1 N% d, I% ~" b8 H
4 ^8 u' `4 I# u cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷
- r: {/ p3 T9 @1 h6 i9 G7 ~( u( a7 U& t
threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,將其變成黑白兩色的圖樣7 p$ z2 x6 `. N G5 s; F
- K4 @# ^) V& P- p
blur(edges, edges, Size(3, 3)); //進(jìn)行模糊,使用3*3內(nèi)核來降噪9 K, n$ r. S4 F* s9 n- @
- _. G+ @1 ~- D N9 a5 }" {
Canny(edges, edges, 0, 30, 3); //進(jìn)行canny邊緣檢測并顯示
1 v0 ^$ v8 J4 b O2 ^) T; R! w! z' o8 L5 R) U. ^* E6 r& _
// findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,contours是輪廓函數(shù)??* `3 Y# s! c& Y) f; x! e
# p& P& s5 D9 [+ U* N+ A
//CV_RETR_EXTERNAL,僅需要外側(cè)的輪廓用于識別,( J2 i6 T- r1 |- T0 }, b
8 N* P) Z; ?6 T5 j5 D8 F" I
//CV_CHAIN_APPROX_NONE,獲取每個輪廓的每個像素,最好是連續(xù)的,0 Z% ^, S/ B/ u8 [* c. d h
9 M) Z$ L, u6 ~% k& a6 a' e2 @7 r }
+ Q4 \! i5 ?0 p# K
; X: _2 r) ]# B( z2 u+ O imshow("蒜瓣輪廓圖", edges); //顯示當(dāng)前幀
; Z$ ~4 F/ |) c: A x& o
! s8 o, E# v+ y! P if (waitKey(30) >= 0)4 v3 y) S$ S; F& ~' C9 G) k0 g
2 i: v# H1 S/ S' ] break;# x8 h4 O4 Q9 B) `
# h$ Y3 L& t- i$ R' z
, E* ^6 @) B1 `; T. f, d, {8 g
5 }( T( ?; ?# m5 T" M( H% w g5 \ }
, e5 O, y% m" d. n- ^4 i1 \: g' T; Z' i6 {0 @* R+ a ? V E* Y9 `) m
return 0;/ B* _. @# m, Q
+ H+ e' N, s# M: h" N) t} |
|