|
程序如下: ' @8 \. R. R$ c$ T3 T$ J& d A" p/ ` 操作系统: win7 64位 ; Q( q$ g/ h2 z' U) _IDE:VC++2010旗舰版& B) q H1 e" f& @% r1 i2 y* q8 k 视觉软件: OPENCV 3.0: e' @' Z, i' ]# f3 e
" z7 w! {" s9 c6 }' m. w& n 4 ^" b) i/ z9 ?, X. |3 j7 N* A//#include "stdafx.h" 0 Q5 u0 Z) B8 P% O2 Y- }#include "core/core.hpp"3 _ k) ]; {2 }7 I" L/ q. k #include 8 J& y( Y y) W- W( H7 u#include . p/ M/ o6 I( o6 i8 Y* n. ~" e #include 3 B" V( K$ w& e- h, ~" Z#include "highgui.h" $ f1 F) G# ?& N# W% @7 K8 @- Q#include 7 n0 \; j% o- w7 B#include / N6 \) u! N" l* x% K0 s( q* i #include //包含所需要的类文件vector,还有一定要加上using namespace std。 " s3 e+ G- S" n#include % g0 L/ E' Q5 M) d, y! S @& k) s#include 5 x, m! ^4 T. O#include % S0 J2 t, ]2 p' x7 z#include " ~8 l8 j* ^( A f2 Z7 [* Z #include "iostream" 9 E6 X( S% q% E#include "cv.h"/ @. q' ~( n# H' Z. S9 M: `+ g #include "highgui.h"% [% }" ~2 K: U+ R1 O8 g using namespace std; % `8 J G7 D& d9 |; x" b$ V' Jusing namespace cv;( {0 z# x% q5 U
# q2 l" [9 |- d, [$ H 2 r) b4 v- l; U% x4 d' Q8 ]& }( \* C8 Z! v. @1 s _7 G) O //-----------------------------------【main( )函数】-------------------------------------------- & U" n3 T4 P4 [// 描述:控制台应用程序的入口函数,我们的程序从这里开始 + ^! P2 t; B- a6 `3 H//------------------------------------------------------------------------------------------------- - s% R) s- n) a% h. H8 l5 c& k, }; s# o6 e8 O2 X. @ int main() 0 n$ i3 \, G4 x# T! V0 A7 Q: H5 d( l6 k/ Q; ?# j0 Q! T {5 Q, C4 m% M# `! C% ^7 m' v/ ^ int chufa=1; + V' G" a6 E W& v6 ~//【1】从摄像头读入视频t3 ]3 l8 y3 I9 S0 p8 @
4 L3 v8 m1 j: Q- b% Q& bVideoCapture capture(0); / | P' M8 i+ `2 A2 }/ } r' w+ ~! M& ^% ]+ X Mat edges; //定义类5 q! r) a8 z# O8 ~, }/ z- v/ I) P 1 d$ B% w- S2 x/ m4 M8 B namedWindow("预处理后的视频", 0);6 H, u: H; K) T' h & _. {' \" A9 m. o // Mat frame; //定义一个Mat变量,用于存储每一帧的图像,将该项至于循环之外,不要重复定义Mat,增快速度;/ w) ?0 ^0 M# M: P8 c: W; j3 s
5 l7 D% q' A: t3 @ O//定义轮廓和层次结构(这个不是很理解)( b0 d( x: L0 R$ z* {, s8 V% r
, k. X2 y8 B" b N/ ~, v//vector>contours; //其中contours 应该是一个变量,可以用在后面的轮廓查找的函数中,定义点的向量2 N+ T3 k$ I N$ B" e2 E 3 U& \4 D- K+ R) u: R //vectorhierarchy; //定义四维向量??? 6 q3 }" T6 `8 g0 z. ]# Q 1 `& v% g! S9 p3 E//【2】循环显示每一帧 ! k! _( b a! q M 2 q4 b6 Q6 g9 h, Lwhile (1) + w/ d I0 V2 D$ K. b 5 I0 T; L# t2 E1 |{: C" }; q6 s, E: p8 n, m/ ^
8 c( A5 [# s# ?1 t1 u//读入图像& ]2 t5 ]* Z2 o# B) {" i
! V$ D) x0 [# W% ^% N- r6 z( uMat frame; //定义一个Mat变量,用于存储每一帧的图像,将该项至于循环之外,不要重复定义Mat,增快速度; * j9 B- K: H9 ^+ o2 d' m- y! c1 k) W9 v5 S/ o if (chufa=1) //当取样信号为1时,开始取当前帧,然后进行识别* r/ Z* J. i J1 N$ R 3 C$ w8 @( y* C5 v! h: G# i& Q+ R9 H { 1 D0 l% C" ]. Z1 c/ m6 r$ m- J( \7 U: ?2 B capture >> frame; //读取当前帧,videocapture函数是不断读取外界的视频,需要一个类来读取当前帧, 0 O% j! [$ ^4 M5 R5 N2 Vchufa=0;6 @ U3 E. R U" p0 V
, d% D0 w( X( N) [6 ^! @( ~& N3 L//对于只需要一副图片来进行检测的操作来说,每个循环只要出发某个取样信号,取样一次就好了。因此用IF语句 " D7 Y1 @& t6 |$ q- c& R; Q F 7 r; g5 H. J+ X! F8 k% D( McvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果说需要使用颜色检测蒜瓣的底部和头部,可能还需要颜色来判断 ) A/ V! j" i% P7 V: x% W: D 0 i; O" B& l! r9 P- K# G, qthreshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,将其变成黑白两色的图样 ! i8 y# j [2 R1 k9 v . w: U* o" L) T& ublur(edges, edges, Size(3, 3)); //进行模糊,使用3*3内核来降噪 7 n; H6 g/ h' S- _ & ~" M. S- C6 \6 ~2 RCanny(edges, edges, 0, 30, 3); //进行canny边缘检测并显示( E% S9 q3 e j2 D; f& E5 i! d
) n) t# e4 G% a( W: G* U! m// findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原图像为8位单通道图像;其中edges是源文件,contours是轮廓函数?? ! o" x. y3 E* J V) U0 b7 _7 K G+ ]/ g+ K6 D- } //CV_RETR_EXTERNAL,仅需要外侧的轮廓用于识别, % S4 a1 p( F3 y5 N0 F; T6 }7 v* N5 L; T. @ //CV_CHAIN_APPROX_NONE,获取每个轮廓的每个像素,最好是连续的,- ]- `6 z& r+ ^' A
+ C$ L* G8 m8 @4 K$ o. V/ p7 F$ L& Z}8 A* S1 P" d8 ]+ q) u' ^
7 |% x( h: p7 n/ [$ Gimshow("蒜瓣轮廓图", edges); //显示当前帧1 M3 F* K( A: m8 ^ P& C2 }6 C% M' q+ b, e9 V0 _6 w if (waitKey(30) >= 0) ( o, D1 G: E0 v6 C8 L+ d! E+ o# H0 x2 F, A! A0 }1 } break; $ `( e$ A) F6 ?7 P& U% H & i) W. f' j6 L$ K* ~. r* e3 Y- z: R3 A6 D; Q2 N
* ?4 B! z, @; b- |( a( A9 I0 v* A1 J} ; A7 W! M5 [5 t* X / y0 A. u& a" ]% `, O9 lreturn 0;a7 h6 E6 j6 o/ k% s7 ` & H2 d2 u, l8 E0 m } |
|