|
程序如下:
6 _; ^% X H$ k9 k+ `% v; a3 G7 G: D$ X9 ^" W
操作系統(tǒng): win7 64位
: R! r/ h* Y) A( o- K$ dIDE:VC++2010旗艦版6 Q$ V |. x& W1 m3 H! K4 h6 J O
視覺軟件: OPENCV 3.0& f6 r- A7 r2 ?7 c7 b
' Q! X, @5 |, i6 K/ b7 n: u$ U
& m+ S, O& m7 W& A1 f0 W# [- n+ ~' E//#include "stdafx.h"4 z! u& h% Y! |. `
#include "core/core.hpp"5 c7 a% Z% {6 _
#include <opencv2/imgproc/imgproc.hpp>
5 C! r9 n& A$ g: v#include <opencv2/highgui/highgui.hpp>
% u# x, B! |2 t: Z! j#include <iostream>& L; m G5 K# U% s2 r+ T
#include "highgui.h"- ]& R) r5 \% o+ \' j8 `
#include <set>$ }7 m8 U8 l. @& a/ |" `: c" R: P
#include <opencv2\opencv.hpp>
_3 O& {! [1 K8 C3 S1 F" w8 |#include<vector> //包含所需要的類文件vector,還有一定要加上using namespace std。
/ j9 o4 `$ t, e1 l1 @#include <stdio.h>! t1 B7 q) U+ f, x& T
#include <conio.h>2 l* C! |4 y: y$ R# _5 a
#include <opencv2/highgui/highgui_c.h>
3 ]6 n" J2 y' B o! C5 B/ I#include <math.h>6 `' [! Z. q* D( e6 E0 F4 A
#include "iostream"
. H) c# M8 y6 n' Y% |#include "cv.h"
2 r# {2 L( @; Z9 R8 _9 P/ p( h" J#include "highgui.h"
+ a5 ~# ^. Q% M, n' Ausing namespace std;
! I- Q5 v; `* T* _6 ausing namespace cv;
7 n L- S2 I- I' u1 D( `9 b: d- g, Z/ [: L# ]7 n: n7 q
# |: o$ A4 b$ G1 `* k' O/ r
; j3 C0 r+ M. _" q* C7 x7 ~6 T
//-----------------------------------【main( )函數(shù)】--------------------------------------------5 T0 u. h& P7 a# I; I2 ?$ M! V
// 描述:控制臺應(yīng)用程序的入口函數(shù),我們的程序從這里開始% r `7 J2 G; ^- r) D8 A/ b
//-------------------------------------------------------------------------------------------------: f3 q- A1 E- [' F+ Y
" H [8 l: U: a* i* [& j9 E( s; `int main()6 Z1 d3 S- f3 i( C, l p% r/ V
% |: E6 h0 M4 D n4 d" E; [{6 e* ?' I1 M! S
int chufa=1;
0 q( f1 z. l! x8 p6 M+ l //【1】從攝像頭讀入視頻
& Q2 S9 T3 O) L. M7 d3 e! H5 l; l' y6 u
VideoCapture capture(0);
1 C& o, f/ X. P
' w- `4 P- C' l/ y6 g: ~9 Q Mat edges; //定義類. N1 u5 g1 `5 i8 @6 H8 F
3 Q7 @ Z5 Y/ B3 w3 Z3 vnamedWindow("預(yù)處理后的視頻", 0);
; C8 e" s$ m9 D
+ ]: P3 _/ a0 ^/ l // Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環(huán)之外,不要重復(fù)定義Mat,增快速度;# [' B% j, x" f0 f$ B
) Z$ Y0 Z9 E2 K1 Q" a& `6 M//定義輪廓和層次結(jié)構(gòu)(這個不是很理解)* h( d7 @- e& [) j1 e0 W
% D. T+ m1 k, Y; x, U$ T9 N//vector<vector<Point>>contours; //其中contours 應(yīng)該是一個變量,可以用在后面的輪廓查找的函數(shù)中,定義點的向量
' u& j7 J9 l. b! y3 f: i8 Z2 N9 U0 ?- o8 _; e! b/ }
//vector<Vec4i>hierarchy; //定義四維向量???; ]# z) {5 _4 _0 f
/ L% d0 O) u& F# j! t7 u' c//【2】循環(huán)顯示每一幀4 [+ ^3 l$ F }4 q* ~4 D
9 e, ~7 M' y+ T: _8 s+ [2 `$ C
while (1)
( T% K0 i2 I5 G2 _/ e+ r2 t
8 ]) O+ Y- M0 h/ z {
/ W1 L8 s9 s+ J5 w/ B, W! z1 k' n3 x: e/ ] l0 a4 S7 ^' k2 i
//讀入圖像
+ O& Y, m4 b1 e, Z( t- f) F4 h9 L$ q4 s
Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環(huán)之外,不要重復(fù)定義Mat,增快速度;6 h1 O9 \9 y) T6 L0 G
& S# m) E/ g" g5 p8 q1 U
if (chufa=1) //當(dāng)取樣信號為1時,開始取當(dāng)前幀,然后進(jìn)行識別
3 C- }( O3 A: m- {
: V T/ r1 f/ q9 l, T {: j& Z+ }2 A! A& D9 y" s
7 L) Q* O$ M! {; k1 ~6 l
capture >> frame; //讀取當(dāng)前幀,videocapture函數(shù)是不斷讀取外界的視頻,需要一個類來讀取當(dāng)前幀,+ S+ L& @( G6 s0 H
chufa=0;
/ }% [+ E3 i9 [2 ~% P$ I; d# i9 }! A5 N: D/ S
//對于只需要一副圖片來進(jìn)行檢測的操作來說,每個循環(huán)只要出發(fā)某個取樣信號,取樣一次就好了。因此用IF語句
* O N' }$ R! D8 {0 l4 _+ ]" q+ Z2 F4 F8 s6 h3 S5 n9 g# S2 _8 h
cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷- c! ^* }. L4 E, b: r
2 F$ h' G* P( R7 d2 ] threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,將其變成黑白兩色的圖樣0 p E( D$ Z, }. L( O, e# i0 N
0 n; z& W- n& x
blur(edges, edges, Size(3, 3)); //進(jìn)行模糊,使用3*3內(nèi)核來降噪
3 a1 ?1 V6 ]/ z% Q* y
( _0 G6 O" z% X3 w1 Y3 i, e2 u) \ Canny(edges, edges, 0, 30, 3); //進(jìn)行canny邊緣檢測并顯示
}' L6 z H$ O( X, G5 D6 w
! Y9 p& C- A/ ]+ u- [& F0 C5 } // findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,contours是輪廓函數(shù)??$ O2 c4 _( r, m3 T
6 ?/ S; j: w; S& M" B //CV_RETR_EXTERNAL,僅需要外側(cè)的輪廓用于識別,
6 \; r2 J; R4 |0 K1 y- H# ~5 N2 I% `. ~2 t/ V B
//CV_CHAIN_APPROX_NONE,獲取每個輪廓的每個像素,最好是連續(xù)的,& g h# I: X5 o8 h7 Z2 Q1 I- P
5 r! j! y4 V1 Y* [8 \- l2 E1 A
}( g A$ g4 l9 \& e8 h
( H2 F6 } e0 j9 X& N7 o, b imshow("蒜瓣輪廓圖", edges); //顯示當(dāng)前幀. z! ]+ \! {% f- I
2 E( P+ {/ U8 \( M
if (waitKey(30) >= 0)
7 R5 V( C, {% b5 u- a+ X0 i- O0 s* i
: q" `2 D b/ P' @; \ break;
& p+ F1 ], B" h. `) c) i: p- S, p* v5 f
& Q& E& z- K! Q4 N5 J+ b) A3 x4 w
+ q0 y2 c+ z5 k& u# _0 D* h; | }
6 K P7 w. s- s( `0 S, f
( x1 F; U# P+ m) u. a$ d return 0;( }6 C2 l- ]) U8 \ C" p2 A& u" I7 m9 J
& {0 a) M7 t: j& i0 T} |
|