请查看以下代码
#include <iostream>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
using namespace std;
using namespace cv;
Mat PeperAndSalt(Mat *,int);
int main()
{
Mat image,image2;
try
{
image = imread("C:/Users/Public/Pictures/Sample Pictures/Chrysanthemum.jpg");
if(!image.data)
{
throw 1;
}
}
catch(int a)
{
cout << "Error. Image does not exist" << endl;
exit(0);
}
//Display Normal Image
namedWindow("Normal Image");
imshow("Normal Image",image);
//Edited Image
image2 = PeperAndSalt(&image,3000);
namedWindow("Edited Image");
imshow("Edited Image",image2);
waitKey(0);
return 0;
}
Mat PeperAndSalt(Mat *imagePtr, int numberOfPixels)
{
srand(numberOfPixels);
Mat newMat;
imagePtr->copyTo(newMat);
for(int a=0;a<numberOfPixels;a++)
{
int column = rand()%newMat.cols;
int row = rand()%newMat.rows;
if(newMat.channels()==1)
{
//Grey Image
newMat.at<uchar>(column,row)= 255;
}
else if(newMat.channels()==3)
{
//Colour Image
newMat.at<Vec3b>(column,row)[0]=255;
newMat.at<Vec3b>(column,row)[1]=255;
newMat.at<Vec3b>(column,row)[2]=255;
}
}
return newMat;
}
此代码生成以下错误
Unhandled exception at 0x756a9617 in OpenCV1.exe: Microsoft C++ exception: cv::Exception at memory location 0x003bf2a0..
这是为什么?请帮忙!
修改
这是错误,发生在Mat.hpp中,它是一个内置的OpenCV类。我在调试时得到了这个
修改
错误就在这一行
image2 = PeperAndSalt(&image,3000);
答案 0 :(得分:3)
将newMat.at<...>(column,row)
替换为newMat.at<...>(row,column)
。
这是代码的一部分。
if(newMat.channels()==1)
{
//Grey Image
newMat.at<uchar>(row,column)= 255;
}
else if(newMat.channels()==3)
{
//Colour Image
newMat.at<Vec3b>(row,column)[0] = 255;
newMat.at<Vec3b>(row,column)[1] = 255;
newMat.at<Vec3b>(row,column)[2] = 255;
}
答案 1 :(得分:2)
根据GDB的输出:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000001029fe2ed
0x0000000100001f60 in PeperAndSalt (imagePtr=0x7fff5fbff820, numberOfPixels=3000) at chrys.cpp:65
65 newMat.at<Vec3b>(column,row)[0]=255;
崩溃发生在:
newMat.at<Vec3b>(column,row)[0]=255;
这意味着您正试图访问Mat
上不存在的位置。 column
或row
不在有效范围内。
快乐狩猎!