以下是OpenCV赢咖4平台的示例,它使用cvGoodFeaturesToTrack来检测网络摄像头视频供稿中的角落。
- // 这个代码显示了opencv函数
- // GoodFeaturesToTrack (cvGoodFeaturesToTrack)
- //
- // 注意:我用哈里斯 Harris
- // 算法注释掉了角点检测,因为我的电脑不够快,不能处理Harris和特征值实时角落
- // 您可以取消注释并自行测试.
- //
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- #include <time.h>
- #define VIDEO_WINDOW "Webcam"
- #define CORNER_EIG "Eigenvalue Corner Detection"
- // 禁用Harris处理
- //#define CORNER_HARRIS "Corner Detection (Harris)"
- #define USEC_PER_SEC 1000000L
- CvScalar target_color[4] = { // in BGR order
- {{ 0, 0, 255, 0 }}, // red
- {{ 0, 255, 0, 0 }}, // green
- {{ 255, 0, 0, 0 }}, // blue
- {{ 0, 255, 255, 0 }} // yellow
- };
- // 返回(t2 - t1)的使用次数
- long time_elapsed (struct timeval &t1, struct timeval &t2) {
- long sec, usec;
- sec = t2.tv_sec - t1.tv_sec;
- usec = t2.tv_usec - t1.tv_usec;
- if (usec < 0) {
- --sec;
- usec = usec + USEC_PER_SEC;
- }
- return sec*USEC_PER_SEC + usec;
- }
- struct timeval start_time;
- struct timeval end_time;
- void start_timer() {
- struct timezone tz;
- gettimeofday (&start_time, &tz);
- }
- long end_timer() {
- struct timezone tz;
- gettimeofday (&end_time, &tz);
- return time_elapsed(start_time, end_time);
- }
- // 一个简单的相机捕捉框架
- int main(int argc, char *argv[]) {
- long harris_time;
- long eig_time;
- CvCapture* capture = 0;
- IplImage* curr_frame = 0; // 当前视频帧
- IplImage* gray_frame = 0; // 当前帧的灰度版本
- int w, h; // video frame size
- IplImage* eig_image = 0;
- IplImage* temp_image = 0;
- // 禁用harris处理
- //IplImage* harris_eig_image = 0;
- //IplImage* harris_temp_image = 0;
- //选择这些捕获方法之一:
- //必须使用ffmpeg编译opencv才能使用Web流!
- //capture = cvCaptureFromFile(
- // "http://user:[email protected]:81/img/video.mjpeg");
- //capture = cvCaptureFromAVI(
- // "http://user:[email protected]:81/img/video.mjpeg");
- // 从网络摄像头
- capture = cvCaptureFromCAM(CV_CAP_ANY);
- //capture = cvCaptureFromCAM(0); // 捕获从视频设备 #0
- if ( !capture) {
- fprintf(stderr, "ERROR: capture is NULL... Exiting/n");
- //getchar();
- return -1;
- }
- // 创建一个窗口,其中将呈现捕获的图像
- cvNamedWindow(VIDEO_WINDOW, 0); // 允许调整窗口大小
- cvNamedWindow(CORNER_EIG, 0); // 允许调整窗口大小
- cvMoveWindow(CORNER_EIG, 330, 0);
- // 禁用harris处理
- //cvNamedWindow(CORNER_HARRIS, 0); // 允许调整窗口大小
- //cvMoveWindow(CORNER_HARRIS, 660, 0);
- // 在窗口中显示从相机捕获的图像,并重复
- while (true) {
- // 获取一帧
- curr_frame = cvQueryFrame(capture);
- if ( !curr_frame) {
- fprintf(stderr, "ERROR: frame is null... Exiting/n");
- //getchar();
- break;
- }
- // 不要释放框架!
- // 获取帧大小
- w = curr_frame->width;
- h = curr_frame->height;
- // 将帧图像转换为灰度
- if( ! gray_frame ) {
- //fprintf(stderr, "Allocate gray_frame/n");
- int channels = 1;
- gray_frame = cvCreateImage(
- cvGetSize(curr_frame),
- IPL_DEPTH_8U, channels);
- }
- cvCvtColor(curr_frame, gray_frame, CV_BGR2GRAY);
- // ==== 为角数组分配内存 ====
- if ( !eig_image) {
- //fprintf(stderr, "Allocate eig_image/n");
- eig_image = cvCreateImage(cvSize(w, h),
- IPL_DEPTH_32F, 1);
- }
- if ( !temp_image) {
- //fprintf(stderr, "Allocate temp_image/n");
- temp_image = cvCreateImage(cvSize(w, h),
- IPL_DEPTH_32F, 1);
- }
- // 禁用harris处理
- // if ( !harris_eig_image) {
- // //fprintf(stderr, "Allocate harris_eig_image/n");
- // harris_eig_image = cvCreateImage(cvSize(w, h),
- // IPL_DEPTH_32F, 1);
- // }
- // if ( !harris_temp_image) {
- // //fprintf(stderr, "Allocate harris_temp_image/n");
- // harris_temp_image = cvCreateImage(cvSize(w, h),
- // IPL_DEPTH_32F, 1);
- // }
- // ==== 角检测: MinEigenVal 方法 ====
- start_timer();
- const int MAX_CORNERS = 100;
- CvPoint2D32f corners[MAX_CORNERS] = {0};
- int corner_count = MAX_CORNERS;
- double quality_level = 0.1;
- double min_distance = 5;
- int eig_block_size = 3;
- int use_harris = false;
- cvGoodFeaturesToTrack(gray_frame,
- eig_image, // 输出
- temp_image,
- corners,
- &corner_count,
- quality_level,
- min_distance,
- NULL,
- eig_block_size,
- use_harris);
- cvScale(eig_image, eig_image, 100, 0.00);
- eig_time = end_timer();
- cvShowImage(CORNER_EIG, eig_image);
- // 禁用harris处理
- // // ==== 角检测: Harris 方法 ====
- // start_timer();
- //// const int MAX_CORNERS = 100;
- // CvPoint2D32f harris_corners[MAX_CORNERS] = {0};
- // int harris_corner_count = MAX_CORNERS;
- // double harris_quality_level = 0.1;
- // double harris_min_distance = 1;
- // int harris_eig_block_size = 3;
- // int harris_use_harris = true;
- //
- // cvGoodFeaturesToTrack(gray_frame,
- // harris_eig_image, // 输出
- // harris_temp_image,
- // harris_corners,
- // &harris_corner_count,
- // harris_quality_level,
- // harris_min_distance,
- // NULL,
- // harris_eig_block_size,
- // harris_use_harris);
- // cvScale(harris_eig_image, harris_eig_image, 200, 0.50);
- // harris_time = end_timer();
- // cvShowImage(CORNER_HARRIS, harris_eig_image);
- //
- // fprintf(stderr, "harris time: %i eig time: %i/n", harris_time, eig_time);
- // ==== 在原始图像中围绕检测到的角点绘制圆形
- //fprintf(stderr, "corner[0] = (%f, %f)/n", corners[0].x, corners[0].y);
- for( int i = 0; i < corner_count; i++) {
- int radius = h/25;
- cvCircle(curr_frame,
- cvPoint((int)(corners[i].x + 0.5f),(int)(corners[i].y + 0.5f)),
- radius,
- target_color[0]);
- }
- cvShowImage(VIDEO_WINDOW, curr_frame);
- // 如果按ESC键, Key=0x10001B under OpenCV 0.9.7(Linux version),
- // 使用AND运算符删除更高位
- if ( (cvWaitKey(10) & 255) == 27)
- break;
- }
- // 释放捕捉设备持家
- cvReleaseCapture( &capture);
- cvDestroyWindow(VIDEO_WINDOW);
- cvDestroyWindow(CORNER_EIG);
- // 禁用harris处理
- // cvDestroyWindow(CORNER_HARRIS);
- return 0;
- }