OpenCV提示is_block_type_valid(header->_block_use)
在实践OpenCV(版本是2.4.9)轮廓查找函数findContours函数时,发现有一个奇怪的bug,代码如下
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
const char* filename = "004.jpg";
Mat src = imread(filename, 0);
if (src.empty())
{
cout << "Couldn't open image!" << filename;
return 0;
}
imshow("原图", src);
//轮廓
vector<vector<Point>> contours;
//使用canny检测出边缘
Mat edge_image;
Canny(src, edge_image, 80, 90);
imshow("canny边缘", edge_image);
//边缘追踪,没有存储边缘的组织结构
findContours(edge_image, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
Mat cimage = Mat::zeros(edge_image.size(), CV_8UC3);
#if 1
for (size_t i = 0; i < contours.size(); i++)
{
//最少的拟合的点数量
size_t count = contours[i].size();
if (count < 400)
continue;
//椭圆拟合
RotatedRect box = fitEllipse(contours[i]);
//如果长宽比大于30,则排除,不做拟合
if (MAX(box.size.width, box.size.height) > (MIN(box.size.width, box.size.height) * 30))
continue;
//画出追踪出的轮廓
drawContours(cimage, contours, (int)i, Scalar::all(255), 1, 8);
//画出拟合的椭圆
ellipse(cimage, box, Scalar(100, 100, 255), 1, CV_AA);
}
imshow("拟合结果", cimage);
#endif // !0
waitKey(0);
destroyAllWindows();
return 0;
}
调试发现,程序return 0之后会弹出一个错误窗口:
查了一番没查到能顺利解决的方法。最后发现放到3.4.0版本的OpenCV中测试则不会出问题。。。暂时不想深究,先做完毕设再好好研究一下OpenCV。