C++ 将图像转换为灰度时,OpenCV中存在异常
出现奇怪的错误。C++ 将图像转换为灰度时,OpenCV中存在异常,c++,opencv,C++,Opencv,出现奇怪的错误。我尝试将图像转换为灰度,然后将结果矩阵打印到文件,但出现异常: “ConsoleApplication1.exe中0x00007FF965E31F28处未处理的异常: 微软C++异常:CV::内存位置异常 0x00000041305AF2A0 下面是代码。当我出错时,有人能告诉我吗 int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); strin
我尝试将图像转换为灰度,然后将结果矩阵打印到文件,但出现异常: “ConsoleApplication1.exe中0x00007FF965E31F28处未处理的异常: 微软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";
}
intmain()
{
freopen(“input.txt”,“r”,stdin);
freopen(“output.txt”,“w”,stdout);
字符串fname;
cin>>fname;
cv::Mat img=readImage(fname);
cv::Mat grayImg(img.size(),cv_64FC1);
如果(img.channels()==3)
{
CVT颜色(img、灰色img、CV_bgr2灰色);
}
其他的
{
img.copyTo(灰色img);
}
printImg(灰色IMG);
cv::waitKey();
返回0;
}
无效打印img(cv::Mat和img)
{
coutOpenCV函数在发生异常时抛出异常。如果将代码放入try-catch块中,则可以看到异常:
int main() try
{
// your code here
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
}
如果发生某些情况,OpenCV函数将抛出异常。如果将代码放入try-catch块中,则可以看到异常:
int main() try
{
// your code here
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
}
我不知道为什么您必须先读取图像,然后将其转换为灰度,而OpenCV支持在通过enum CV\u LOAD\u image\u grayscale读取图像时将图像转换为灰度
接下来,您使用的默认imread将图像作为BGR作为CV_8U通道读取。您不必分配灰度img,cvtColor将为您执行此操作
灰色图像的深度和大小将与原始图像相同
cout << img.at<double>(i, j) << " ";
cout我不知道为什么必须先读取图像,然后将其转换为灰度,而OpenCV支持在通过枚举CV\u LOAD\u image\u灰度读取图像时将图像转换为灰度
接下来,您使用的默认imread将图像作为BGR作为CV_8U通道读取。您不必分配灰度img,cvtColor将为您执行此操作
灰色图像的深度和大小将与原始图像相同
cout << img.at<double>(i, j) << " ";
cout调试器应该告诉您。学习使用调试器,因为这是检查和分析程序行为的正确工具。作为一名程序员,不知道调试器和其他分析工具是不可能的。调试器应该如何告诉我问题出在哪里?我可以说,字符串中的错误“很好,了解什么是调试器?该消息表示最有可能是由于访问冲突(即分段错误)导致的崩溃,在调试器中启动程序并查看崩溃的行,找到错误访问的来源,等等。堆栈跟踪告诉您大部分需要找出错误的内容。您无法转换为灰色在一个步骤中将和缩放到不同的数据类型。首先尝试.cvtColor,然后尝试.convertTo。调试器应该告诉您。学习使用调试器,因为这是检查和分析程序行为的正确工具。作为一名程序员,除了其他分析工具外,不了解调试器是不可能的。调试器应该如何告诉我这里有问题吗?我可以说,那个字符串中的错误"很好,了解什么是调试器?该消息表示最有可能是由于访问冲突(即分段错误)导致的崩溃,在调试器中启动程序并查看崩溃的行,找到错误访问的来源,等等。堆栈跟踪告诉您大部分需要找出错误的内容。您无法转换为灰色OpenCV错误:断言失败(((1)你知道这是什么意思吗?谢谢,它起作用了,但是如果我需要使用double in cout,我必须做什么?正如文档所说,你的灰度深度是基于img深度的。所以你只需要使用cv::Mat的成员函数convertTo来转换img。在你的例子中,img.convertTo(img,cv_64FC3);谢谢,它成功了,但是如果我需要使用double in cout,我必须做什么?正如文档所说,您的灰度img深度基于img深度。所以您只需要使用cv::Mat的成员函数convertTo来转换img。在您的例子中,img.convertTo(img,cv_64FC3);
cout << img.at<uchar>(i, j) << " ";