|
程序如下:6 i6 i: t4 c+ f4 V: L0 ~
' @! Q% L l }* q) P& w h i
操作系統(tǒng): win7 64位
2 Y3 b4 }! e+ BIDE:VC++2010旗艦版 w1 J# y4 V) f
視覺軟件: OPENCV 3.0( i4 C0 A0 e' d. p7 _- {
* |0 w9 C8 K2 Z2 v# a. h% B0 ~
+ S' y7 V+ b8 J! q/ w B
//#include "stdafx.h"
+ o- J3 E% i/ z" G# _3 W#include "core/core.hpp"
. S; H0 @ g, N4 q#include <opencv2/imgproc/imgproc.hpp>4 x+ k) U9 V! y. a' ?6 R. s8 D
#include <opencv2/highgui/highgui.hpp>
l0 {4 a8 o( n( t#include <iostream>
9 T4 Q, z) i: b( w {#include "highgui.h"
! B/ P4 j' ~6 m: f: |( m O1 j, G2 r#include <set>* Y2 n( X/ ]4 j/ `( ?, f9 z
#include <opencv2\opencv.hpp>
( I- }, z" x# ]8 D6 q; a" A: g#include<vector> //包含所需要的類文件vector,,還有一定要加上using namespace std。
9 X: Z0 f, v( k$ n Q3 k9 y+ @8 ]#include <stdio.h>0 K: L) {$ l" ` h
#include <conio.h>& n; N. }6 B% u; P- \- V
#include <opencv2/highgui/highgui_c.h>
/ M3 q- N- T, d' i, x#include <math.h>! ^' S9 s, F1 c* W1 y
#include "iostream"# n9 P9 \. n' o( ~! [% j6 N' e
#include "cv.h"0 q& n M( W+ y& P: p
#include "highgui.h"
( Z0 T# o1 @: [2 Uusing namespace std;
3 {! v$ }' V" ~( T2 a( Yusing namespace cv;0 t7 b8 {" k# P# K
4 |, U% M* x) e# G
8 M/ [, E" ?" c) z
) c3 }5 L" B+ `//-----------------------------------【main( )函數(shù)】--------------------------------------------6 m. K, J" F% K, g( T' Y
// 描述:控制臺應(yīng)用程序的入口函數(shù),,我們的程序從這里開始
2 A& N- Z. W( _& l; s0 _//-------------------------------------------------------------------------------------------------( u8 X' b& R1 B) u
9 X4 v4 D0 \) h8 e7 hint main()
2 C! f6 a1 w, S4 b0 _, T9 J, \" k2 ~9 n
; `" \1 }$ k8 \0 b$ g{
. u) n9 _& T# t4 [int chufa=1;+ f2 o V8 h; [/ v9 J* i# O
//【1】從攝像頭讀入視頻
0 W7 |, K8 ~# E5 N7 Q& Q b- a; w V
VideoCapture capture(0);
8 f( {3 k6 T( W/ f( s0 l: t: x
& M* x! [( K! N. ] Mat edges; //定義類6 [! O8 r5 l b% g# @, k7 y( d
3 N+ |/ [& @2 {- ?0 U
namedWindow("預(yù)處理后的視頻", 0);0 t. M$ b6 z" p
) \9 q' @* R4 x/ Q2 i$ g8 c // Mat frame; //定義一個Mat變量,,用于存儲每一幀的圖像,將該項至于循環(huán)之外,,不要重復(fù)定義Mat,,增快速度;
# P# G- b0 O M! S+ G& I' D
* e2 O- V% g& u; w//定義輪廓和層次結(jié)構(gòu)(這個不是很理解), I4 n5 j& m0 ^, U- Z+ `1 X t0 M
: S- k) m3 M; n- A9 N% j# e0 z
//vector<vector<Point>>contours; //其中contours 應(yīng)該是一個變量,,可以用在后面的輪廓查找的函數(shù)中,,定義點的向量
: |% Y: R; B, ^% K9 o
6 q% k* ]2 H6 H//vector<Vec4i>hierarchy; //定義四維向量?,?,?- a1 j7 d) u( r4 j' N) @# `
( Z! V- l. \# @$ i; O# d$ h//【2】循環(huán)顯示每一幀, J$ h, g6 b( [
6 O* t( R/ m( R5 k
while (1)
0 K% Q) M. D* V$ a2 C$ o2 O1 p* I3 ?
{
$ |* g) S) Z7 b0 T
9 Z# {# V' M( D& I //讀入圖像3 s4 o1 L4 M8 ~% ]+ P. M# C/ e
+ n7 i6 t( S" f! ^; k5 V5 p Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,,將該項至于循環(huán)之外,,不要重復(fù)定義Mat,增快速度,;6 J' P9 M" U/ _% g
) U0 `( g. l. I/ n
if (chufa=1) //當(dāng)取樣信號為1時,,開始取當(dāng)前幀,,然后進(jìn)行識別
# s% {/ e- ~ O9 d. _! p
9 X$ |( @( K# r* d9 i6 \ {+ g; {: `# J3 q7 m Y; X/ ^
V0 X! |% c5 D+ i& |; }
capture >> frame; //讀取當(dāng)前幀,videocapture函數(shù)是不斷讀取外界的視頻,,需要一個類來讀取當(dāng)前幀,,& I$ ?1 E4 E9 N6 M* Z* \
chufa=0;3 F( b d% z# }& t2 ?
1 B' v2 g1 |$ ]9 h7 n //對于只需要一副圖片來進(jìn)行檢測的操作來說,每個循環(huán)只要出發(fā)某個取樣信號,,取樣一次就好了,。因此用IF語句( d3 g: H9 R0 Q, a
( s4 z! u1 a5 L6 M: T) U, _/ F4 Q3 ~ cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷" X8 \( u0 }% ^0 j
( b' Z: N8 ~7 x! h threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,,將其變成黑白兩色的圖樣' ^+ } J% s" s; m
* X+ Z4 @8 Q4 W4 P' T: q1 B* s
blur(edges, edges, Size(3, 3)); //進(jìn)行模糊,,使用3*3內(nèi)核來降噪/ X8 D6 H& @5 m6 G
5 y5 o. Y J& p( x. ]4 f1 h. K Canny(edges, edges, 0, 30, 3); //進(jìn)行canny邊緣檢測并顯示7 r$ x4 P2 {3 l5 n; O& h W
( ]: |! I0 E' d6 V( B ~# D# ] // findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,,contours是輪廓函數(shù),??! a) G/ g( `- H6 V' h
, W$ l4 P7 Z2 ]) ?$ p
//CV_RETR_EXTERNAL,僅需要外側(cè)的輪廓用于識別,,0 g. r' g6 t; ~$ h
~. U% O6 Z6 r: F! X9 v //CV_CHAIN_APPROX_NONE,,獲取每個輪廓的每個像素,最好是連續(xù)的,,
3 ^7 ^+ ?8 E- `
4 [, U. U: t2 U% E- P }
' u' \ J! D2 b6 ~ q2 {8 E+ R6 E( E0 ]1 M! o, F) t& t5 j. n
imshow("蒜瓣輪廓圖", edges); //顯示當(dāng)前幀
5 S* }! b8 ]( w9 | j5 W: a$ p5 W/ E/ o K, M0 s: d. [
if (waitKey(30) >= 0): a6 p, e) p/ j& V! r7 _, @5 O8 T
9 D' M) \! M$ E3 \/ R break;/ x, I4 _3 `8 z- }
! _$ P7 { w0 x+ F5 q9 m 1 D' B% z. Y9 B2 h( z
2 F5 n9 x T. B5 R
}
/ |* b0 N, u( i3 s& j0 C9 w0 r: I" X2 @
return 0;
3 y4 a7 T1 c y/ a1 G, c& f) A( I8 G& e" n |' s: f6 ~, s
} |
|