我有一个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];