我在 findContours 函数上 100% 确定地发生了堆损坏。当我不使用它时,一切正常。
unsigned char* UCFromMatUC(cv::Mat& input)
{
int size = input.size.p[0] * input.size.p[1];
unsigned char* result = new unsigned char[size];
memcpy(result, input.data, size);
return result;
}
unsigned char* CannyEdgeCV(unsigned char* input, int width, int height)
{
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::RNG rng(12345);
cv::Mat inp(cv::Size(width, height), CV_8UC1, input);
cv::Mat canny_output;
cv::Mat outp;
cv::blur(inp, outp, cv::Size(3,3));
cv::Canny(outp, canny_output, 4.0, 8.0);
if(canny_output.type()!=CV_8UC1){
return NULL;
}
cv::findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );
cv::Mat drawing = cv::Mat::zeros( canny_output.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, cv::Point() );
}
cv::imwrite( "contours.jpg", drawing );
unsigned char* result = UCFromMatUC(canny_output);
return result;
}
最初我只使用 canny 边缘图,但后来我想测试轮廓功能的结果。
Canny Edge 工作正常,我得到了预期的图像,但是 findContours(代码中的版本和注释版本)失败并出现堆损坏错误。这是什么原因造成的?
其入口点是 CannyEdgeCV(),并使用 640x480 8 位灰度图像调用。
编辑:更新代码。
Edit2:当我试图创建一个最小的例子来重现这个时,我的代码甚至在 imread("imagename.bmp"); 处都失败了。这真的很奇怪,所以我开始调查可能导致这种情况的原因。现在其他人在相应的 SO 问题中写道,您不能混合调试/发布模式库,因此如果您处于调试状态,则必须使用调试 DLL,这对我有用,我得到了预期的结果。