我需要检测对象的图像轮廓。为此,我正在使用OpenCV库的函数findContours
。我在使用OpenCV 3.0 (x86)
编译的Windows 10 (x64)
contrib modules
上使用findContours
。
问题在于,当我尝试使用此功能时,应用程序崩溃。错误不是异常或断言失败,我只能看到一个窗口告诉我应用程序崩溃了:
我已经检查过我传递给CV_8U
的图像是二进制图像:
我检查了图像的类型,它是0,与// This is the main function:
int test_findContours(const std::string &path){
Mat img = imread(path, IMREAD_GRAYSCALE);
if (!img.data){
cout << "ERROR" << endl;
return -1;
}
Mat mask;
getRemBackgroundMask(img, mask);
vector< vector<Point> > contours;
// Here the program crashes:
findContours(mask, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
return 0;
}
// Get the mask to remove the background
void getRemBackgroundMask(const Mat &img, Mat &mask) {
threshold(img, mask, 70, 1, THRESH_BINARY_INV);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
openning(mask, mask, kernel);
}
void openning(const Mat &binary, Mat &result, const Mat &kernel){
erode(binary, result, kernel);
dilate(binary, result, kernel);
}
值相同。
我甚至检查了直方图,并且只有值为0和1的像素。
我还从OpenCV教程和论坛中搜索了一些示例,我尝试的做法与示例完全相同,并且程序再次崩溃。
以下是我正在执行的代码:
ansible-galaxy install nickhammond.logrotate
答案 0 :(得分:4)
我发现了这个问题。提到的错误显然是因为我使用Visual Studio 2013的Debug配置和OpenCV的Release库(* .libs没有'd')。我已经使用Release配置测试了该程序并且它可以工作。我甚至绘制了检测到的轮廓,功能正常。
答案 1 :(得分:1)
到目前为止,我已经找到了几种使findcontours()崩溃的方法
1)源图像不是灰度
2)轮廓的类型容器不正确-您必须使用(此结构)
std::vector<std::vector<cv::Point> > yourContour;
3)阈值设置为相同的值或阈值2小于1
4)源图像太大。
这!是最有可能的罪魁祸首。如今,手机可以拍摄出可笑的分辨率的图片,可悲的是,OpenCv并没有将来证明其代码,并且崩溃是由于溢出造成的。 这是一个已知问题,可以在这里找到更多信息: https://github.com/opencv/opencv/issues/7449
即使认为它是固定的,在大多数情况下这也是罪魁祸首。我使用的是OpenCV 3.4.1,它是最新的稳定版本,其修复方法是以可管理的旧分辨率(例如800x600)明确声明源和目标cv :: mats