opencv在内存位置出现异常

时间:2018-11-26 10:49:13

标签: c++ visual-studio opencv

我是新的opencv c ++开发人员。我应用了SLIC超像素,所以我有Mat:label包含每个像素的ID,我在图像上应用了SPLIT以获取绿色通道,然后我希望更改ID = 150的特定像素的值(每个像素=!必须将150转换为黑色像素)。调试后,我得到了这个错误以及这个window

  

在0x00007FFB63A0A388处引发的异常:Microsoft C ++异常:内存位置0x0000001496AFE290处的cv :: Exception。   0x00007FFB63A0A388处未处理的异常:Microsoft C ++异常:内存位置0x0000001496AFE290处的cv :: Exception。

这是我的代码

   int main()
{

    Mat labels;
    Mat RGB[3], HSV[3],S_HSV,image3;
    vector<double> STD, generale_mean;
    Mat image, Red, Green, Blue, image2,mask,Gray;
    int region_number;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    image = imread("D:\\mémoire\\eye.png", CV_LOAD_IMAGE_COLOR);

    //applying the superpixel 

    Ptr<cv::ximgproc::SuperpixelSLIC> slic = cv::ximgproc::createSuperpixelSLIC(image, 100,50, 0.01);
    slic->iterate(10);
    if (true)
        slic->enforceLabelConnectivity(50);

    slic->getLabelContourMask(mask, true);
    image.setTo((0, 0, 255), mask);
    slic->getLabels(labels);
    region_number = slic->getNumberOfSuperpixels();

    cv::cvtColor(image, image, CV_BGR2RGB);

    cv::cvtColor(image, Gray,CV_RGB2GRAY);

    split(image, RGB);

    Red.push_back(RGB[0]);
    Green.push_back(RGB[1]);
    Blue.push_back(RGB[2]);

        int f = 150;
        Mat Green1 = Green.clone();
        int Y =0;

        for (int j = 0; j < Green1.rows; j++) {
            for (int i = 0; i < Green1.cols; i++) {

                double N = labels.at<double>(Point(i, j));
                if (N =! f) 

                    Green1.at<double>(Point(i, j)) = 00000;

            }
        }

        cv::imshow("green", Green1);        

    waitKey(0);         // Wait for a keystroke in the window
    return 0;
}

1 个答案:

答案 0 :(得分:2)

图像类型有问题。当您使用以下命令在OpenCV中加载图片时:

image = imread(filename, CV_LOAD_IMAGE_COLOR);

它将是CV8UC3类型的图像。这意味着它将具有3个通道(C3部分),并且每个通道的每个像素值均为8位无符号整数类型。在C ++中,您可以使用uchar。然后,在使用at函数时,需要使用可以正确保存信息的类型,在这种情况下,即为uchar。在您的代码中,您可以:

Green1.at<double>(Point(i, j)) = 00000;

应为:

Green1.at<uchar>(j,i) = 0;

请注意,Point(i,j)也是不需要的,可以用j,i代替。

.at<type>(row, column)函数与do等效:

Mat test;
type* data = reinterpret_cast<type*>(test.data);
data[row][column];

您还存在以下问题:

double N = labels.at<double>(Point(i, j));

但标签是由

分配的
slic->getLabels(labels);

给出了CV_32SC1类型的垫->表示1通道和32位带符号整数,或者在C ++中为int。

那么这应该是:

int N = labels.at<int>(j,i);

最后:

这个

Red.push_back(RGB[0]);
Green.push_back(RGB[1]);
Blue.push_back(RGB[2]);

应为:

Red = RGB[0];
Green = RGB[1];
Blue = RGB[2];