OpenCV

来自百合仙子's Wiki
跳转到导航 跳转到搜索

示例

区域匹配

/* ===================================================================== *
 *  图像区域匹配
 *  注意:如有多个匹配,将找到首先匹配的那个。
 * ===================================================================== */
#include<stdio.h>
#include<cv.h>
#include<highgui.h>
/* --------------------------------------------------------------------- */
int main(int argc, char **argv){
  IplImage *img, *template;

  if(argc != 3){
    fprintf(stderr, "give me two images please.\n");
    return 1;
  }
  // 1 means CV_LOAD_IMAGE_COLOR (colorful, not grayscale)
  if((img = cvLoadImage(argv[1], 1)) == 0 || (template = cvLoadImage(argv[2], 1)) == 0){
    fprintf(stderr, "failed to load images\n");
    return 2;
  }

  int resultW = img->width - template->width + 1;
  int resultH = img->height - template->height + 1;

  IplImage *result =
    cvCreateImage(cvSize(resultW, resultH), IPL_DEPTH_32F, 1);

  cvMatchTemplate(img, template, result, CV_TM_CCOEFF_NORMED);

  double max_interlinkage = 0;
  double min_interlinkage = 0;

  CvPoint max_point;
  CvPoint min_point;
  CvPoint corner_point;

  cvMinMaxLoc(result, &min_interlinkage, &max_interlinkage, &min_point,
      &max_point, NULL);

  if(max_interlinkage > 0.8){
    corner_point =
      cvPoint(max_point.x + template->width, max_point.y + template->height);
    cvRectangle(img, max_point, corner_point, CV_RGB(255, 0, 255), 1, 8, 0);
    printf("matched at (%d, %d).\n", max_point.x, max_point.y);

    cvNamedWindow("Match", CV_WINDOW_AUTOSIZE);
    cvShowImage("Match", img);
  }else{
    puts("no match.");
  }

  cvWaitKey(0); /* 等待时间,单位毫秒。0 为一直等待下去。 */

  cvDestroyWindow("Match");
  cvReleaseImage(&img);
  return 0;
}
/* ===================================================================== *
 * vim modeline                                                          *
 * vim:se fdm=expr foldexpr=getline(v\:lnum)=~'^\\S.*{'?'>1'\:1:         *
 * ===================================================================== */

转换为灰度图

#include<stdio.h>
#include<stdbool.h>
#include<cv.h>
#include<highgui.h>

#define WIN_ORIG "图像"
#define WIN_P "处理后"

int main(int argc, char **argv){
  if(argc != 2){
    fprintf(stderr, "one image please.\n");
    return 1;
  }

  IplImage* img;
  IplImage* gray_img;
  img = cvLoadImage(argv[1], 1);
  cvNamedWindow(WIN_ORIG, CV_WINDOW_AUTOSIZE);
  cvShowImage(WIN_ORIG, img);

  cvNamedWindow(WIN_P, CV_WINDOW_AUTOSIZE);
  /* only one channel after conversion */
  gray_img = cvCreateImage(cvGetSize(img), img->depth, 1);
  
  cvCvtColor(img, gray_img, CV_BGR2GRAY);
  cvShowImage(WIN_P, gray_img);

  char c;
  while(true) {
    c = cvWaitKey(0);
    if(c == 'q')
      break;
  }
  cvDestroyWindow(WIN_ORIG);
  cvDestroyWindow(WIN_P);
  cvReleaseImage(&img);
  cvReleaseImage(&gray_img);

  return 0;
}

外部链接

资源

教程