OpenCV - 如何以 Mat 形式编写 IplImage 数组?
OpenCV - How to write IplImage array in Mat form?
我的旧项目是用 C 编写的,其中包含很多 "IplImage"。
举个例子,
IplImage** img_array = new IplImage* [img_number];
for(int i = 0; i < img_number; i++)
{
img_array[i] = cvCreateImage(cvSize(320, 240), IPl_DEPTH_8U, 3);
cvSet(img_array[i], cvScalar(0, 0, 0));
}
.
.
.
.
.
for(int i = 0; i < img_number; i++)
{
cvReleaseImage(&img_array[i]);
}
delete[] img_array;
现在我必须将我的项目重写成 C++ 形式,我应该使用它 cv::Mat。
但是,我不确定将上面的代码写入 cv::Mat?
的相同方法
我试过这样写:
int dims[] = {img_number, 320, 240};
cv::Mat img_array(3, dims, CV_8UC3);
虽然一切看起来都很好,但是当涉及到一条线时:
for(int i = 0; i < img_number; i++)
{
img_array[i] = random_img.clone();
}
出现错误:
C2676:binary operator'[':'cv::Mat'does not define this operator or a conversion to a type acceptable to the predefined operator
之后我找到了另一种可能的方法,但需要使用矢量:
vector<Mat> img_array;
for(int i = 0 ; i < img_number; i++)
{
img_array.push_back(random_img.clone());
}
我还没实现,不知道是不是我想要的方案?
欢迎任何建议。
您应该将 cv::Mat
class 视为旧 IplImage*
的替代品。您使用的构造函数应该创建一个多维 cv::Mat
实例,这可能不是您想要的。根据您基于 IplImage*
的代码,您可能试图从一组 IplImage
指针创建一组 Mat 图像。为此,这个 ctor 会更好地服务:
Mat::Mat(const IplImage* img, bool copyData=false)
如果您将 copyData
参数设置为 true,构造函数将像往常一样复制 IplImage* 的内容并控制新的数据缓冲区(引用计数、适当的释放)等)如果将其设置为 false,将使用原始 IplImage* 数据,您必须注意不要在完成 cv::Mat 实例之前释放它。
原始文档是here
而且,是的,通常最好将 cv::Mat 实例放入向量中。在这种情况下,当向量超出范围时,Mat
s 使用的内存将自动释放(除非您创建了其他一些引用原始数据的 cv::Mat
s,但这是另一回事)
编辑
看来不建议使用上面的 Mat 构造函数。您应该改用 cvarrToMat()
函数,如 this 问题
的答案中所建议
我的旧项目是用 C 编写的,其中包含很多 "IplImage"。
举个例子,
IplImage** img_array = new IplImage* [img_number];
for(int i = 0; i < img_number; i++)
{
img_array[i] = cvCreateImage(cvSize(320, 240), IPl_DEPTH_8U, 3);
cvSet(img_array[i], cvScalar(0, 0, 0));
}
.
.
.
.
.
for(int i = 0; i < img_number; i++)
{
cvReleaseImage(&img_array[i]);
}
delete[] img_array;
现在我必须将我的项目重写成 C++ 形式,我应该使用它 cv::Mat。
但是,我不确定将上面的代码写入 cv::Mat?
的相同方法我试过这样写:
int dims[] = {img_number, 320, 240};
cv::Mat img_array(3, dims, CV_8UC3);
虽然一切看起来都很好,但是当涉及到一条线时:
for(int i = 0; i < img_number; i++)
{
img_array[i] = random_img.clone();
}
出现错误:
C2676:binary operator'[':'cv::Mat'does not define this operator or a conversion to a type acceptable to the predefined operator
之后我找到了另一种可能的方法,但需要使用矢量:
vector<Mat> img_array;
for(int i = 0 ; i < img_number; i++)
{
img_array.push_back(random_img.clone());
}
我还没实现,不知道是不是我想要的方案?
欢迎任何建议。
您应该将 cv::Mat
class 视为旧 IplImage*
的替代品。您使用的构造函数应该创建一个多维 cv::Mat
实例,这可能不是您想要的。根据您基于 IplImage*
的代码,您可能试图从一组 IplImage
指针创建一组 Mat 图像。为此,这个 ctor 会更好地服务:
Mat::Mat(const IplImage* img, bool copyData=false)
如果您将 copyData
参数设置为 true,构造函数将像往常一样复制 IplImage* 的内容并控制新的数据缓冲区(引用计数、适当的释放)等)如果将其设置为 false,将使用原始 IplImage* 数据,您必须注意不要在完成 cv::Mat 实例之前释放它。
原始文档是here
而且,是的,通常最好将 cv::Mat 实例放入向量中。在这种情况下,当向量超出范围时,Mat
s 使用的内存将自动释放(除非您创建了其他一些引用原始数据的 cv::Mat
s,但这是另一回事)
编辑
看来不建议使用上面的 Mat 构造函数。您应该改用 cvarrToMat()
函数,如 this 问题