需求描述:开关门检测,打算使用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
用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);
最终解决了这个问题。