opencv3下使用SIFT算法,vs2015 qt画界面遇到的坑

需求描述:开关门检测,打算使用SIFT来做。目前官方的SIFT仅在opencv2版本中存在。在3或4版本中不存在。而vs2015 qt中编写的界面,若用opencv2413拉取rtsp视频流的话,会出现花屏现象。因此,要使用opencv3及以上版本,并且必须带contrib,也就是必须带sift算法。

这里先分享csdn某博主分享的opencv342x86_with_contrib,带SIFT算法,不过只有x86版本:

链接:https://pan.baidu.com/s/1VnCW1xdXqRy-RL6Lz5_JJQ 
提取码:74bv

踩过的坑,根据回忆简单整理:

1. 最重要的是要好好理解SIFT算法,才能熟练运用。

2. CC.exe换到另外机器上无法运行的问题:

  (1)因为是用QT写的,所以应该生成QT以来的platforms等文件夹,用这个命令:

要运行命令,找到下图并点开:

(2)运行cc.exe后缺失很多dll

扫描二维码关注公众号,回复: 10404249 查看本文章

用Depends.exe查找缺失的dll,并放到exe所在目录即可。

这里有一个大坑 ,如果你编译的是x86工程,那像vcruntime140.dll这些动态库并不是在system32中的,而是在syswow64目录下:

这也是我在补全确实的dll后,运行cc.exe仍然不能执行(00000x7错误)的原因。在我把dll从syswow64翻出来加到cc.exe目录下以后,就好使了。

(3)跑sift,在detect(image, keypoints)报错

这个错误也耗费了我大量的时间,查了很多资料:

》》》有的说vector<cv::KeyPoint> keypoints未初始化导致的,要keypoints.resize(1000)先这样做

》》》有说要bool initModule_nonfree(void)加入的。opencv3的nonfree.hpp在xfeatures2d文件夹下。

》》》有的说输入图像要是灰度图。但是我已经转换了。

都不好使。

有一句话提醒了我,SiftFeatureDetector detector这个指针是不是空的。有人建议这样写:

    cv::Ptr<SiftFeatureDetector>        detector    = SiftFeatureDetector::create();            //sift
    cv::Ptr<SiftDescriptorExtractor>    extractor    = SiftDescriptorExtractor::create();        //sift

    detector->detect(input_roi, keypoints);
    extractor->compute(input_roi, keypoints, descriptor);  

最终解决了这个问题。

发布了59 篇原创文章 · 获赞 57 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/xiakejiang/article/details/104966027