#include "cv.h"
#include "highgui.h"
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
char wndname[] = "Edge";
char tbarname[] = "Threshold";
int edge_thresh = 1;
IplImage *frame, *cedge = 0, *gray = 0, *edge = 0;
// 定义跟踪条的 callback 函数
void on_trackbar(int h)
{
}
int main( int argc, char** argv )
{
VideoCapture cap(0);//在<opencv2/highgui/highgui.hpp>中,win7摄像头只能这样打开
if(!cap.isOpened())
{
return -1;
}
Mat framemat;//每一帧画面
// 循环捕捉,直到用户按键跳出循环体
bool stop = false;
while(!stop)
{
cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100, on_trackbar);
cap>>framemat;
frame = &IplImage(framemat);
// Create the output image
cedge = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 3);
// 将彩色图像转换为灰度图像
gray = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1);
edge = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1);
cvCvtColor(frame, gray, CV_BGR2GRAY);
cvSmooth( gray, edge, CV_BLUR, 3, 3, 0 );
cvNot( gray, edge );//将src中的每一个元素的每一位取反,然后把结果赋给dst。
// 对灰度图像进行边缘检测
cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 3);
cvZero( cedge );
cvCopy( frame, cedge, edge );
cvNamedWindow(wndname, 1);
cvShowImage(wndname, cedge);
if(waitKey(30) >=0)
stop = true;
}
// Wait for a key stroke; the same function arranges events processing
cvReleaseImage(&gray);//注意不要释放frame,会报错
cvReleaseImage(&edge);
cvDestroyWindow(wndname);
return 0;
}