aihot  2017-05-31 22:15:17  OpenCV |   查看评论   

 以下是OpenCV赢咖4平台的示例,它使用cvGoodFeaturesToTrack来检测网络摄像头视频供稿中的角落。

 

  1. // 这个代码显示了opencv函数
  2. // GoodFeaturesToTrack (cvGoodFeaturesToTrack)
  3. //
  4. // 注意:我用哈里斯 Harris 
  5. // 算法注释掉了角点检测,因为我的电脑不够快,不能处理Harris和特征值实时角落
  6. // 您可以取消注释并自行测试.
  7. //
  8. #include <cv.h>
  9. #include <highgui.h>
  10. #include <stdio.h>
  11. #include <time.h>
  12. #define VIDEO_WINDOW   "Webcam"
  13. #define CORNER_EIG     "Eigenvalue Corner Detection"
  14. // 禁用Harris处理
  15. //#define CORNER_HARRIS  "Corner Detection (Harris)"
  16. #define USEC_PER_SEC 1000000L
  17. CvScalar target_color[4] = { // in BGR order 
  18.   {{   0,   0, 255,   0 }},  // red
  19.   {{   0, 255,   0,   0 }},  // green
  20.   {{ 255,   0,   0,   0 }},  // blue
  21.   {{   0, 255, 255,   0 }}   // yellow
  22. };
  23. // 返回(t2 - t1)的使用次数
  24. long time_elapsed (struct timeval &t1, struct timeval &t2) {
  25.  long sec, usec;
  26.  sec = t2.tv_sec - t1.tv_sec;
  27.  usec = t2.tv_usec - t1.tv_usec;
  28.  if (usec < 0) {
  29.   --sec;
  30.   usec = usec + USEC_PER_SEC;
  31.  }
  32.  return sec*USEC_PER_SEC + usec;
  33. }
  34. struct timeval start_time;
  35. struct timeval end_time;
  36. void start_timer() {
  37.  struct timezone tz;
  38.  gettimeofday (&start_time, &tz);
  39. }
  40. long end_timer() {
  41.  struct timezone tz;
  42.  gettimeofday (&end_time, &tz);
  43.  return time_elapsed(start_time, end_time);
  44. }
  45. // 一个简单的相机捕捉框架
  46. int main(int argc, char *argv[]) {
  47.  long harris_time;
  48.  long eig_time;
  49.  CvCapture* capture = 0;
  50.  IplImage* curr_frame = 0; // 当前视频帧
  51.  IplImage* gray_frame = 0; // 当前帧的灰度版本
  52.  int w, h; // video frame size
  53.  IplImage* eig_image = 0;
  54.  IplImage* temp_image = 0;
  55.  // 禁用harris处理
  56.  //IplImage* harris_eig_image = 0;
  57.  //IplImage* harris_temp_image = 0;
  58.  
  59.  //选择这些捕获方法之一:
  60.  //必须使用ffmpeg编译opencv才能使用Web流!
  61.  //capture = cvCaptureFromFile(
  62.  //  "http://user:[email protected]:81/img/video.mjpeg");
  63.  //capture = cvCaptureFromAVI(
  64.  //  "http://user:[email protected]:81/img/video.mjpeg");
  65.  
  66.  // 从网络摄像头
  67.  capture = cvCaptureFromCAM(CV_CAP_ANY);
  68.  //capture = cvCaptureFromCAM(0); // 捕获从视频设备 #0
  69.  if ( !capture) {
  70.   fprintf(stderr, "ERROR: capture is NULL... Exiting/n");
  71.   //getchar();
  72.   return -1;
  73.  }
  74.  
  75.  // 创建一个窗口,其中将呈现捕获的图像
  76.  cvNamedWindow(VIDEO_WINDOW, 0); // 允许调整窗口大小
  77.  
  78.  cvNamedWindow(CORNER_EIG, 0); // 允许调整窗口大小
  79.  cvMoveWindow(CORNER_EIG, 330, 0);
  80.  
  81.  // 禁用harris处理
  82.  //cvNamedWindow(CORNER_HARRIS, 0); // 允许调整窗口大小
  83.  //cvMoveWindow(CORNER_HARRIS, 660, 0);
  84.  
  85.  // 在窗口中显示从相机捕获的图像,并重复
  86.  while (true) {
  87.   
  88.   // 获取一帧
  89.   curr_frame = cvQueryFrame(capture);
  90.   if ( !curr_frame) {
  91.    fprintf(stderr, "ERROR: frame is null... Exiting/n");
  92.    //getchar();
  93.    break;
  94.   }
  95.   // 不要释放框架!
  96.   // 获取帧大小
  97.   w = curr_frame->width;
  98.   h = curr_frame->height;
  99.   // 将帧图像转换为灰度
  100.   if( ! gray_frame ) {
  101.    //fprintf(stderr, "Allocate gray_frame/n");
  102.    int channels = 1;
  103.    gray_frame = cvCreateImage(
  104.      cvGetSize(curr_frame), 
  105.      IPL_DEPTH_8U, channels);
  106.   }
  107.   cvCvtColor(curr_frame, gray_frame, CV_BGR2GRAY);
  108.   
  109.   // ==== 为角数组分配内存 ====
  110.   if ( !eig_image) {
  111.    //fprintf(stderr, "Allocate eig_image/n");
  112.    eig_image = cvCreateImage(cvSize(w, h),
  113.      IPL_DEPTH_32F, 1);
  114.   }
  115.   if ( !temp_image) {
  116.    //fprintf(stderr, "Allocate temp_image/n");
  117.    temp_image = cvCreateImage(cvSize(w, h),
  118.      IPL_DEPTH_32F, 1);
  119.   }
  120. // 禁用harris处理
  121. //  if ( !harris_eig_image) {
  122. //   //fprintf(stderr, "Allocate harris_eig_image/n");
  123. //   harris_eig_image = cvCreateImage(cvSize(w, h),
  124. //     IPL_DEPTH_32F, 1);
  125. //  }
  126. //  if ( !harris_temp_image) {
  127. //   //fprintf(stderr, "Allocate harris_temp_image/n");
  128. //   harris_temp_image = cvCreateImage(cvSize(w, h),
  129. //     IPL_DEPTH_32F, 1);
  130. //  }
  131.   
  132.   // ==== 角检测: MinEigenVal 方法 ====
  133.   start_timer();
  134.   const int MAX_CORNERS = 100;
  135.   CvPoint2D32f corners[MAX_CORNERS] = {0};
  136.   int corner_count = MAX_CORNERS;
  137.   double quality_level = 0.1;
  138.   double min_distance = 5;
  139.   int eig_block_size = 3;
  140.   int use_harris = false;
  141.   
  142.   cvGoodFeaturesToTrack(gray_frame,
  143.     eig_image,                    // 输出
  144.     temp_image,
  145.     corners,
  146.     &corner_count,
  147.     quality_level,
  148.     min_distance,
  149.     NULL,
  150.     eig_block_size,
  151.     use_harris);
  152.   cvScale(eig_image, eig_image, 100, 0.00);
  153.   eig_time = end_timer();
  154.   cvShowImage(CORNER_EIG, eig_image);
  155.   
  156. // 禁用harris处理
  157. //  // ==== 角检测: Harris 方法 ====
  158. //  start_timer();
  159. ////  const int MAX_CORNERS = 100;
  160. //  CvPoint2D32f harris_corners[MAX_CORNERS] = {0};
  161. //  int harris_corner_count = MAX_CORNERS;
  162. //  double harris_quality_level = 0.1;
  163. //  double harris_min_distance = 1;
  164. //  int harris_eig_block_size = 3;
  165. //  int harris_use_harris = true;
  166. //  
  167. //  cvGoodFeaturesToTrack(gray_frame,
  168. //    harris_eig_image,                    // 输出
  169. //    harris_temp_image,
  170. //    harris_corners,
  171. //    &harris_corner_count,
  172. //    harris_quality_level,
  173. //    harris_min_distance,
  174. //    NULL,
  175. //    harris_eig_block_size,
  176. //    harris_use_harris);
  177. //  cvScale(harris_eig_image, harris_eig_image, 200, 0.50);
  178. //  harris_time = end_timer();
  179. //  cvShowImage(CORNER_HARRIS, harris_eig_image);
  180. //  
  181. //  fprintf(stderr, "harris time: %i  eig time: %i/n", harris_time, eig_time);
  182.   
  183.   // ==== 在原始图像中围绕检测到的角点绘制圆形
  184.   //fprintf(stderr, "corner[0] = (%f, %f)/n", corners[0].x, corners[0].y);
  185.   for( int i = 0; i < corner_count; i++) {
  186.    int radius = h/25;
  187.    cvCircle(curr_frame,
  188.      cvPoint((int)(corners[i].x + 0.5f),(int)(corners[i].y + 0.5f)),
  189.      radius,
  190.      target_color[0]);
  191.   }
  192.   cvShowImage(VIDEO_WINDOW, curr_frame);
  193.   // 如果按ESC键, Key=0x10001B under OpenCV 0.9.7(Linux version),
  194.   // 使用AND运算符删除更高位
  195.   if ( (cvWaitKey(10) & 255) == 27)
  196.    break;
  197.  }
  198.  // 释放捕捉设备持家
  199.  cvReleaseCapture( &capture);
  200.  cvDestroyWindow(VIDEO_WINDOW);
  201.  cvDestroyWindow(CORNER_EIG);
  202. // 禁用harris处理
  203. // cvDestroyWindow(CORNER_HARRIS);
  204.  return 0;
  205. }
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自倾斜OpenCV:使用cvGoodFeaturesToTrack进行角点检测

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]