OpenCV / C ++ - 生成变量/向量?检测多个不同的对象

时间:2015-02-09 14:43:05

标签: c++ opencv parameter-passing

我有一个OpenCV程序,它接收模板图像并将其与视频源进行比较。我希望能够将多个模板图片与视频Feed进行比较,但我无法理解所需的逻辑。

我有一个视频捕获线程,它接收帧,将它们转换为灰色并将它们返回到main()

Mat captureThread() {
  if(captureOpen == false){
    img_scene = cvCaptureFromCAM(0);
  }
  while(1) {
    image = cvQueryFrame(img_scene);
    cvtColor(image, gray, CV_BGR2GRAY);
    return gray;
  }
}

然后调用预处理功能,其中传递模板图像以进行特征点检测。这些是通过命令行参数读入的,并按如下方式传递:

  for(int i = 1; i < argc; i++) {
    img_object = imread( argv[i], CV_LOAD_IMAGE_GRAYSCALE );
    preProcessing(img_object, argv[i]);
  }

void preProcessing(Mat img_object, char* objectName) {
  featureDetector->detect(img_object, keypointsObject);
  featureExtractor->compute(img_object, keypointsObject, descriptorsObject);
}

正如您所看到的那样,关键点和描述符被分配给变量(Vector和Mat),然后在实时处理线程中将它们与视频源进行比较。

Mat processingThread(Mat gray, Mat img_object) {
  featureDetector->detect(gray, keypoints);
  featureExtractor->compute(gray, keypoints, descriptors);
  Ptr<DescriptorMatcher> matcher(new BFMatcher(NORM_HAMMING, false));
  std::vector<DMatch> matches;
  if(descriptorsObject.type() == descriptors.type() && descriptorsObject.cols == descriptors.cols) {
    matcher->match(descriptorsObject, descriptors, matches);
  }
  ...
  ...
  return imgMatches;
}

其余main()

  while(1) {
    thread t1(captureThread); 
    t1.join();
    captureOpen = true;
    thread t2(processingThread, gray, img_object);
    t2.join();
    imshow("Output", imgMatches);
    key = cvWaitKey(5);
    if (char(key) == 27) {
      break;
    }  
  }

我应该采取什么方法来预处理多个模板图像,然后将它们与主视频源进行比较,以查看是否找到了任何模板图像?是否可以为传入的每个图像生成新的变量/向量?

编辑: 到目前为止,我传输的每个图像都与关键点和描述符一起传递到数组中:

Mat imageArray[2];
Mat descriptorsArray[2];
vector<KeyPoint> keypointArray[2];

0 个答案:

没有答案