Opencv邊緣檢測

        最近開始學習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通道的,用image
	cvCopy( frame, image, out );

	if ( image->origin != frame->origin)
		image->origin = frame->origin;
	//顯示3通道的邊緣圖像
	cvShowImage( "Camera", image );

	//釋放內存
	cvReleaseImage( &image );
	cvReleaseImage( &gray );
	cvReleaseImage( &out );
}

效果圖


發佈了31 篇原創文章 · 獲贊 60 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章