我是 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();
}
在
return_image
中,您的 grid_color
数组在函数末尾超出了范围,尽管您使用指向它的指针作为 img
的数据缓冲区。
这将允许
img
指向函数范围内的正确数据。但是,一旦函数返回并且释放了本地作用域中的内存,img
现在将持有一个指向已释放内存的无效指针。