c++ - opencv内存位置异常

标签 c++ visual-studio opencv

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

Exception thrown at 0x00007FFB63A0A388 : Microsoft C++ exception: cv::Exception at memory location 0x0000001496AFE290. Unhandled exception at 0x00007FFB63A0A388 : Microsoft C++ exception: cv::Exception at memory location 0x0000001496AFE290.

这是我的代码

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

最佳答案

您对图像类型有疑问。当您使用 OpenCV 加载图像时:

image = imread(filename, CV_LOAD_IMAGE_COLOR);

这将是 CV8UC3 类型的图像。这意味着它将有 3 个 channel (C3 部分),并且每个 channel 的每个像素值都是 8 位的 unsigned int 类型。在 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 类型的 mat -> 这意味着 1 个 channel 和 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];

关于c++ - opencv内存位置异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53479495/

相关文章:

visual-studio - 如何在构建时缩小已更改(并且仅更改它们)的 JavaScript 文件(也就是将 "ItemGroup"添加到 csproj 后的重复项)

c++ - Visual Studio 2013 中的 Lua C API 堆栈可视化器/查看器

python - 如何使用Python计算图像上的彩色像素区域?

c++ - 检查类是否有指针数据成员

c++ - Boost::GIL 'jpeglib.h':没有那个文件或目录

asp.net - 为什么我的 ASP.NET 项目不在启动项目中,而是在开发服务器上运行?

c++ - 使用 OpenCV 3 的 OCRTesseract 示例

c++ - 哪个 Nsight 版本可以在 Visual Studio 2010 中使用 CUDA 5.5?

c++ - alloca 返回的指针的基于索引的访问和 "placement new"的效果

带有多个网络摄像头的 OpenCV - 如何判断代码中的哪个摄像头?