最近开始学习Opencv,使用Opencv自带的Canny算法做了一个小应用,顿时感受到计算机视觉的奇妙。
程序很简单,流程如下:
1.打开摄像头
程序很简单,流程如下:
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 );
}
效果图