2013-04-09 104 views
0

请看看下面的代码内存位置错误

#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。我得到这个在调试

enter image description here

编辑

错误是在这条线

image2 = PeperAndSalt(&image,3000); 
+6

你调试了吗?如果是这样,哪一行产生异常? – 2013-04-09 14:44:38

+1

好吧,因为有'Unhandler异常','handle'(使用'try-catch'),看看有什么例外+它的描述 – 2013-04-09 14:44:42

+0

@LuchianGrigore:说实话,我不知道如何做适当的调试VS.当我按F11进行调试时,它在调用opencv类时显示问题 – 2013-04-09 15:04:36

回答

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; 
    } 
+0

太棒了!谢谢!!! – 2013-04-09 16:41:46

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的位置。 columnrow不在有效范围内。

快乐狩猎!