gpt4 book ai didi

c++ - 使用 OpenCV 2.4.10 的简要实现

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:23 25 4
gpt4 key购买 nike

有人知道使用 OpenCV 2.4 实现 BRIEF 的链接吗?问候。

PS:我知道在 SO 上通常不欢迎这样的问题,因为主要关注的是你做了什么工作。但是有一个类似的 question非常受欢迎。

该问题的一个答案提出了 SIFT 的通用方式,可以扩展到 BRIEF。这是我稍微修改过的代码。

#include <opencv2/nonfree/nonfree.hpp> 
#include <opencv2/highgui/highgui.hpp>

//using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
Mat image = imread("load02.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::initModule_nonfree();
// Create smart pointer for SIFT feature detector.
Ptr<FeatureDetector> featureDetector = FeatureDetector::create("HARRIS"); // "BRIEF was initially written. Changed after answer."
vector<KeyPoint> keypoints;

// Detect the keypoints
featureDetector->detect(image, keypoints); // NOTE: featureDetector is a pointer hence the '->'.

//Similarly, we create a smart pointer to the SIFT extractor.
Ptr<DescriptorExtractor> featureExtractor = DescriptorExtractor::create("BRIEF");

// Compute the 128 dimension SIFT descriptor at each keypoint.
// Each row in "descriptors" correspond to the SIFT descriptor for each keypoint
Mat descriptors;
featureExtractor->compute(image, keypoints, descriptors);

// If you would like to draw the detected keypoint just to check
Mat outputImage;
Scalar keypointColor = Scalar(255, 0, 0); // Blue keypoints.
drawKeypoints(image, keypoints, outputImage, keypointColor, DrawMatchesFlags::DEFAULT);

namedWindow("Output");
imshow("Output", outputImage);

char c = ' ';
while ((c = waitKey(0)) != 'q'); // Keep window there until user presses 'q' to quit.

return 0;

}

此代码的问题在于它会给出错误:Project2.exe 中 0x00007FFB84698B9C 处的第一次机会异常:Microsoft C++ 异常:cv::Exception at memory location 0x00000071F4FBF8E0。

错误导致函数执行中断。一个标记表示执行将在 namedWindow("Output"); 行恢复。

有人可以帮助解决这个问题,或者建议一个新的代码吗?谢谢。

编辑:终端现在显示错误:断言失败(!outImage.empty())在 cv::drawKeypoints,文件 ..\..\..\..opencv\modules\features2d\src\draw.cpp,第 115 行。代码将继续的下一条语句保持不变,因为 drawKepoints 就在它之前被调用。

最佳答案

在 OpenCV 中,BRIEF 是一个DescriptorExtractor,而不是一个FeatureDetector。根据FeatureDetector::create , 此工厂方法不支持 "BRIEF" 算法。换句话说,FeatureDetector::create("BRIEF") 返回一个空指针,您的程序就会崩溃。

特征匹配的一般步骤是:

  1. 在图像中找到一些有趣的(特征)点:FeatureDetector
  2. 找到一种方法来描述这些点:DescriptorExtractor
  3. 尝试匹配两个图像中的描述符(特征向量):DescriptorMatcher

BRIEF 是一个只针对第 2 步的算法。您可以在第 2 步中使用一些其他方法,HARRISORB,... 1 并使用 BRIEF 将结果传递给步骤 2。此外,SIFT 可用于步骤 1 和步骤 2,因为该算法为这两个步骤提供了方法。


这是一个在 OpenCV 中使用 BRIEF 的简单示例。第一步,找到图像中看起来有趣的点(关键点):

vector<KeyPoint> DetectKeyPoints(const Mat &image) 
{
auto featureDetector = FeatureDetector::create("HARRIS");
vector<KeyPoint> keyPoints;
featureDetector->detect(image, keyPoints);
return keyPoints;
}

您可以尝试任何 FeatureDetector algorithm而不是 "HARRIS"。下一步,从关键点计算描述符:

Mat ComputeDescriptors(const Mat &image, vector<KeyPoint> &keyPoints)
{
auto featureExtractor = DescriptorExtractor::create("BRIEF");
Mat descriptors;
featureExtractor->compute(image, keyPoints, descriptors);
return descriptors;
}

您可以使用 algorithm也不同于 "BRIEF"。你可以看到 DescriptorExtractor 中的算法与 FeatureDetector 中的算法不同。最后一步,匹配两个描述符:

vector<DMatch> MatchTwoImage(const Mat &descriptor1, const Mat &descriptor2)
{
auto matcher = DescriptorMatcher::create("BruteForce");
vector<DMatch> matches;
matcher->match(descriptor1, descriptor2, matches);
return matches;
}

同样,你可以尝试不同的matching algorithm除了 "BruteForce"。最后回到主程序,您可以从这些函数构建应用程序:

auto img1 = cv::imread("image1.jpg");
auto img2 = cv::imread("image2.jpg");

auto keyPoints1 = DetectKeyPoints(img1);
auto keyPoints2 = DetectKeyPoints(img2);

auto descriptor1 = ComputeDescriptors(img1, keyPoints1);
auto descriptor2 = ComputeDescriptors(img2, keyPoints2);

auto matches = MatchTwoImage(descriptor1, descriptor2);

并使用matches vector 来完成您的应用程序。如果想查看结果,OpenCV还提供了functions在图像中绘制步骤 1 和 3 的结果。比如最后一步绘制火柴:

Mat result;
drawMatches(img1, keyPoints1, img2, keyPoints2, matches, result);
imshow("result", result);
waitKey(0);

关于c++ - 使用 OpenCV 2.4.10 的简要实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com