c – OpenCV:如何使用掩码参数进行特征点检测(SURF)

我想将SurfFeatureDetector限制为一组区域(掩码).对于测试,我只定义一个掩码:
Mat srcImage; //RGB source image
Mat mask = Mat::zeros(srcImage.size(),srcImage.type());
Mat roi(mask,cv::Rect(10,10,100,100));
roi = Scalar(255,255,255);
SurfFeatureDetector detector();
std::vector<KeyPoint> keypoints;
detector.detect(srcImage,keypoints,roi); // crash
//detector.detect(srcImage,keypoints); // does not crash

当我通过“roi”作为掩码时,我得到了这个错误

OpenCV Error: Assertion Failed (mask.empty() || (mask.type() == CV_8UC1 && mask.size() == image.size())) in detect,file /Users/ux/Downloads/OpenCV-iOS/OpenCV-iOS/../opencv-svn/modules/features2d/src/detectors.cpp,line 63

这有什么问题?如何正确地将掩码传递给SurfFeatureDetector的“detect”方法

问候,

解决方法

关于面具的两件事.

>掩码应该是8位无符号字符的1通道矩阵,转换为opencv类型CV_8U.在您的情况下,掩码是srcImage.type()类型,它是一个3通道矩阵
>你正在将roi传递给探测器,但你应该通过面具.当你对roi进行更改时,你也在改变面具.

以下应该有效

Mat srcImage; //RGB source image
Mat mask = Mat::zeros(srcImage.size(),CV_8U);  // type of mask is CV_8U
// roi is a sub-image of mask specified by cv::Rect object
Mat roi(mask,100));
// we set elements in roi region of the mask to 255 
roi = Scalar(255);  
SurfFeatureDetector detector();
std::vector<KeyPoint> keypoints;
detector.detect(srcImage,mask);     // passing `mask` as a parameter

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...