有奇怪的错误。
我尝试将图像转换为灰度,然后将打印结果矩阵转换为文件,但得到异常:
“ConsoleApplication1.exe中0x00007FF965E31F28处的未处理异常: Microsoft C ++异常:cv ::内存位置的异常 0x00000041305AF2A0。
以下代码如下。
当我犯错误时,有人能说我吗?
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
string fname;
cin >> fname;
cv::Mat img = readImage(fname);
cv::Mat grayImg(img.size(), CV_64FC1);
if (img.channels() == 3)
{
cvtColor(img, grayImg, CV_BGR2GRAY);
}
else
{
img.copyTo(grayImg);
}
printImg(grayImg);
cv::waitKey();
return 0;
}
void printImg(cv::Mat &img)
{
cout << "---------//------\n";
if (img.empty())
{
cout << "Empty Image\n";
return;
}
for (int i = 0; i < img.size().height; i++)
{
for (int j = 0; j < img.size().width; j++)
{
cout << img.at<double>(i, j) << " ";
}
cout << endl;
}
cout << "---------//------\n";
}
字符串中的错误
cout << img.at<double>(i, j) << " ";
答案 0 :(得分:2)
如果发生某些事情,OpenCV函数会抛出异常。如果你将你的代码放在try-catch块中,你可以看到它们:
int main() try
{
// your code here
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
}
当发生不好的事情时 - 只需查看终端输出,你就会遗漏原因。
<强>更新强> 收到错误消息后 - 很容易解决它。您期望具有64位双精度值,但您的灰度值为8位无符号字符
我在您的代码中提出了应该有所帮助的更改:
cv::Mat grayImg;
if (img.channels() == 3)
cvtColor(img, grayImg, CV_BGR2GRAY);
else if (img.channels() == 4)
cvtColor(img, grayImg, CV_BGRA2GRAY);
else grayImg = img;
// here grayImg is 8-bit unsigned char
// change it to doubles:
cv::Mat gray64bit;
grayImg.convertTo(gray64bit, CV_64FC1);
printImg(gray64bit);
答案 1 :(得分:1)
我不知道为什么你必须阅读图像然后将其转换为灰度,而OpenCV支持在通过枚举CV_LOAD_IMAGE_GRAYSCALE读取图像时将图像转换为灰度。
接下来,您使用的默认imread会将图像读取为BGR作为CV_8U通道。你不必分配grayImg,cvtColor会为你做。
http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor
grayImg将具有与原始相同的深度和大小。所以你的
cout << img.at<double>(i, j) << " ";
产生错误。 它应该是
cout << img.at<uchar>(i, j) << " ";