程序很簡單,流程如下:
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通道的,用image
cvCopy( frame, image, out );
if ( image->origin != frame->origin)
image->origin = frame->origin;
//顯示3通道的邊緣圖像
cvShowImage( "Camera", image );
//釋放內存
cvReleaseImage( &image );
cvReleaseImage( &gray );
cvReleaseImage( &out );
}
效果圖