最近開始學習Opencv,使用Opencv內建的Canny演算法做了一個小應用,頓時感受到電腦視覺的奇妙。
程式很簡單,流程如下:
1.開啟網路攝影機
2.對視頻進行邊緣檢測
3.輸出檢測到的邊緣
程式提供了2個滑動條,可以根據具體情況,自己更改閾值觀察效果
開發環境:VC++6.0 + Opencv1.0
代碼如下:
#include "cxcore.h"#include "cvcam.h"#include "cv.h"#include "highgui.h"#include <stdio.h>IplImage *frame;void show();void on_trackbar1(int h);void on_trackbar2(int h);int low = 0,high =100;int main(){char c;int edge_thresh1 = 1;int edge_thresh2 = 100;//讀取網路攝影機 CvCapture *capture = cvCreateCameraCapture(0);cvNamedWindow("Camera",CV_WINDOW_AUTOSIZE);//建立2個捲軸,on_trackbar1,on_trackbar2為回呼函數cvCreateTrackbar( "Low", "Camera", &edge_thresh1, 100, on_trackbar1); cvCreateTrackbar( "High", "Camera", &edge_thresh2, 100, on_trackbar2); while(1){frame = cvQueryFrame(capture);//顯示提取映像邊緣的視頻show();//按ESC鍵退出c = cvWaitKey(33);if( c == 27 )break;}cvReleaseCapture( &capture );cvDestroyWindow( "Camera" ); return 0;}void on_trackbar1(int h){low = h;show();}void on_trackbar2(int h){high = h;show();}void show(){IplImage* gray = cvCreateImage( cvSize(frame->width, frame->height ), IPL_DEPTH_8U, 1 );IplImage* out = cvCreateImage( cvSize(frame->width, frame->height ), IPL_DEPTH_8U, 1 );IplImage* image = cvCreateImage( cvSize(frame->width, frame->height ), IPL_DEPTH_8U, 3 );//轉為灰階圖cvCvtColor(frame,gray,CV_RGB2GRAY);//cvCanny只能識別灰階圖cvCanny( gray, out, low, high, 3 );//origin屬性是標註視頻的原點是左上方還是左下角,要使原點統一,否則顯示的視頻會倒置if( out->origin != gray->origin )out->origin = gray->origin;//out是提取的邊緣映像,是一個單通道的;這裡讓它顯示為3通道的,用imagecvCopy( frame, image, out );if ( image->origin != frame->origin)image->origin = frame->origin;//顯示3通道的邊緣映像cvShowImage( "Camera", image );//釋放記憶體cvReleaseImage( &image );cvReleaseImage( &gray );cvReleaseImage( &out );}