-1

我正在尝试在 iOS 上使用 OpenCV 进行对象检测。我正在使用文档中的此代码示例

这是我的代码:

Mat src = imread("src.jpg");
Mat templ = imread("logo.jpg");

Mat src_gray;
cvtColor(src, src_gray, CV_BGR2GRAY);

Mat templ_gray;
cvtColor(templ, templ_gray, CV_BGR2GRAY);

int minHessian = 500;

OrbFeatureDetector detector(minHessian);

std::vector<KeyPoint> keypoints_1, keypoints_2;

detector.detect(src_gray, keypoints_1);
detector.detect(templ_gray, keypoints_2);

OrbDescriptorExtractor extractor;

Mat descriptors_1, descriptors_2;

extractor.compute(src_gray, keypoints_1, descriptors_1);
extractor.compute(templ_gray, keypoints_2, descriptors_2);

问题在于始终为空的extractor.compute(src_gray, keypoints_1, descriptors_1);descriptors_1

src并且templ不为空。

有什么想法吗?

谢谢

4

1 回答 1

1

首先,我认为如果你想使用特征检测器和描述符,你必须了解它们是如何工作的。你可以看到这个话题,'Penelope'的答案比我能做的更好地解释了一切: https ://dsp.stackexchange.com/questions/10423/why-do-we-use-keypoint-descriptors

在第一步之后,我认为您应该更好地了解 ORB 检测器/描述符的工作原理(如果您真的想使用它),它的参数是什么等。为此,您可以查看 opencv 文档和 ORB 论文:

http://docs.opencv.org/modules/features2d/doc/feature_detection_and_description.html https://www.willowgarage.com/sites/default/files/orb_final.pdf

我这样说是因为当“minHessian”实际上是来自 SURF 检测器的参数时,您在 ORB 检测器上设置了“minHessian”参数。

无论如何,您的代码的问题不是那样。尝试像您下面的示例一样加载您的图像:

Mat src = imread("src.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat templ = imread("logo.jpg", CV_LOAD_IMAGE_GRAYSCALE );

然后检测关键点:

detector.detect(src, keypoints_1);
detector.detect(templ, keypoints_2);

现在检查 keypoints_1 和 keypoints_2 是否不为空。如果他们要进行描述符提取!它应该工作

希望这可以帮助

于 2014-10-16T10:14:50.350 回答