我有一个指向图片的指针:
IplImage *img;
已转换为 Mat
Mat mt(img);
接下来,将Mat
发送到一个函数中,该函数以Mat &m
为输入参数。
f(mt);
现在我想将Mat
数据复制回原始图像。
您有任何建议吗?
最好的祝福, Ali
我有一个指向图片的指针:
IplImage *img;
已转换为 Mat
Mat mt(img);
接下来,将Mat
发送到一个函数中,该函数以Mat &m
为输入参数。
f(mt);
现在我想将Mat
数据复制回原始图像。
您有任何建议吗?
最好的祝福, Ali
//Convert to IplImage or CvMat, no data copying
IplImage ipl_img = img;
CvMat cvmat = img; // convert cv::Mat -> CvMat
code
`int test(IplImage **srcImage, int num_images)
{
vector<Mat> images(num_images); for (int i = 0; i < num_images; ++i)
{
images[i] = Mat(srcImage[i]); // 我猜这是正确的!
....
// 对images[i]进行一些操作
}
for (int i = 0; i < num_images; ++i)
{
srcImage[i] = ??????
} }`
- Edifor (int i = 0; i < num_images; ++i)
{
cvReleaseImage(&srcImage[i]);
srcImage[i] = new IplImage(images[i]);
}
}
- Edi对于以下情况:
double algorithm(IplImage* imgin)
{
//blabla
return erg;
}
cv::Mat image = cv::imread("image.bmp");
double erg = algorithm(&image.operator IplImage());
我进行了一些测试,看起来图像对象将管理内存。运算符IplImage()
仅构造IplImage
的标头。也许这会有用?
您可以使用以下表单:
您的代码:
plImage *img;
Mat mt(img);
f(mt);
现在将Mat数据复制回原始图像。
img->imageData = (char *) mt.data;
您还可以复制数据而不是指针:
memcpy(mt.data, img->imageData, (mt.rows*mt.cols));
(mt.rows*mt.cols) 是您应该用于将所有数据从mt复制到img的大小。
希望我能帮到您。
Mat mt(img)
不会复制图像数据,因此只要您不执行重新分配的操作(例如将mt分配给独立的其他Mat),就无需进行任何操作。 - Barney Szabolcs