查询由于在 C++ 和 openCV 中的 Mat* 变量中存储(保存)数据而导致的图像差异

问题描述 投票:0回答:1

我是 C++ 初学者。我用两种不同的方式编写的代码有不同的结果。我认为这是由于指针造成的,但我不知道为什么。在 return_image 函数内部,图像是好的,但在函数外部,当指针接收时,图像被破坏。 return_image2函数的图像都很好。 我附上了一张 OK 图像和一张 NG 图像。

PS C:\opencv\pjt> g++ e.cpp -o e.exe -I"c:\opencv uild\install\include" -L"c:\opencv uild\install\x64\mingw\lib" -L"c:\opencv uild\install\x64\mingw in" -lopencv_core470 -lopencv_highgui470 -lopencv_imgproc470 -lopencv_imgcodecs470 PS C:\opencv\pjt> ./e

#include <opencv2/highgui.hpp> // Mat
#include <opencv2/opencv.hpp> // rectangle
#include <iostream>

using namespace cv;
using namespace std;

void return_image(int x, int y, Mat* result)
{
    Mat img=Mat (x, y, CV_8UC3);

    int k=0;
    unsigned char grid_color[x*y*3];
    unsigned char *grid_color_ptr=&grid_color[0];

    for (int i=0;i<x;i++) for(int j=0;j<y;j++) {
     grid_color[k]=j; // B
     k++;
     grid_color[k]=j; // G
     k++;
     grid_color[k]=j; // R
     k++;
     }

    ////////////////////////////
    img.data=grid_color_ptr;
    ////////////////////////////

    rectangle(img, Rect(Point(0, 0), Point(img.cols, img.rows)), Scalar(0, 0, 255), 3, 4, 0);
    *result=img;

    imshow("original image", *result); // Image OK
    moveWindow("original image",0,0);
}

void return_image2(int x, int y, Mat* result)
{
    Mat img=Mat (x, y, CV_8UC3);

    int k=0;

    ////////////////////////////
    for (int i=0;i<x;i++) for(int j=0;j<y;j++) {
     img.data[k]=j; // B
     k++;
     img.data[k]=j; // G
     k++;
     img.data[k]=j; // R
     k++;
     }
    ////////////////////////////

    rectangle(img, Rect(Point(0, 0), Point(img.cols, img.rows)), Scalar(0, 0, 255), 3, 4, 0);
    *result=img;
    imshow("original image2", *result); // Image OK
    moveWindow("original image2",0,175);
}

main() {

    Mat img;
    return_image(150,255,&img);
    imshow("returned image", img); // Image NG
    moveWindow("returned image",255,0);

    Mat img2;
    return_image2(150,255,&img2);
    imshow("returned image2", img2); // Image OK
    moveWindow("returned image2",255,175);

    waitKey(0);
    destroyAllWindows();
}

enter image description here

c++ opencv pointers opencv-mat
1个回答
0
投票

return_image
中,您的
grid_color
数组在函数末尾超出了范围,尽管您使用指向它的指针作为
img
的数据缓冲区。

这将允许

img
指向函数范围内的正确数据。但是,一旦函数返回并且释放了本地作用域中的内存,
img
现在将持有一个指向已释放内存的无效指针。

© www.soinside.com 2019 - 2024. All rights reserved.