OpenCV 图像阵列,4D 矩阵

Posted

技术标签:

【中文标题】OpenCV 图像阵列,4D 矩阵【英文标题】:OpenCV image array, 4D matrix 【发布时间】:2011-12-05 13:48:17 【问题描述】:

我正在尝试将IPL_DEPTH_8U,3 通道图像存储到一个数组中,以便可以在内存中存储 100 个图像。

为了初始化我的 4D 数组,我使用了以下代码(行、列、通道、存储):

int size[] =  324, 576, 3, 100 ;
CvMatND* cvImageBucket; = cvCreateMatND(3, size, CV_8U);

然后我创建了一个矩阵并将图像转换为矩阵

CvMat *matImage = cvCreateMat(Image->height,Image->width,CV_8UC3 );
cvConvert(Image, matImage );

我如何/访问 CvMatND 以将 CvMat 复制到存储位置?

例如cvImageBucket(:,:,:,0) = matImage; // copied first image into array

【问题讨论】:

看看这个***.com/questions/6493687/… 【参考方案1】:

您已将其标记为 C 和 C++。如果你想在 C++ 中工作,你可以使用(在我看来)更简单的 cv::Mat structure 来存储每个图像,然后使用这些来填充所有图像的 vector。

例如:

std::vector<cv::Mat> imageVector;
cv::Mat newImage;

newImage = getImage();       // where getImage() returns the next image,
                             // or an empty cv::Mat() if there are no more images
while (!newImage.empty())

    // Add image to vector
    imageVector.push_back(image);

    // get next image
    newImage = getImage();

【讨论】:

【参考方案2】:

我猜测类似于:

对于第一个 matImage

memcpy((char*)cvImageBucket->data+i*size[0]*size[1]*size[2],(char*)matImage->data,size[0]*size[1]*size[2]);

【讨论】:

【参考方案3】:

虽然我同意@Chris 最好使用vector&lt;Mat&gt; 而不是4D matrix,但这个答案仅供那些真正需要在OpenCV 中使用4D 矩阵的人参考(即使这是一个非常不受支持、未记录和未探索的东西,在线可用的东西很少,并且声称工作得很好!)。

所以,假设您用2D3D 数据填充了vector&lt;Mat&gt; vec,这些数据可以是CV_8UCV_32F 等。

创建 4D 矩阵的一种方法是

vector<int> dims = (int)vec.size(), vec[0].rows, vec[0].cols;
Mat m(dims, vec[0].type(), &vec[0]);

但是,当向量不连续时,这种方法会失败,这通常是大矩阵的情况。如果您对不连续矩阵执行此操作,当您想使用矩阵(即复制、克隆等)时,您将获得 segmentation faultbad access error。为了克服这个问题,您可以将向量的矩阵一一复制到 4D 矩阵中,如下所示:

Mat m2(dims, vec[0].type());
for (auto i = 0; i < vec.size(); i++)
    vec[i].copyTo(temp.at<Mat>(i));

请注意,这两种方法都要求矩阵具有相同的分辨率。否则,您可能会得到不希望的结果或错误。

另外,请注意,您始终可以使用for loops,但在可以使用vectorize 时使用它们通常不是一个好主意。

【讨论】:

以上是关于OpenCV 图像阵列,4D 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV大型阵列类型Mat类

OpenCV-通道合并cv::merge

opencv怎么将图像数据存入矩阵

OpenCV-Python实战——OpenCV简介与图像处理基础(万字总结,️建议收藏️)

opencv中为啥图像局矩阵是以BGR而不是RGB显示像素的大小?

OpenCV创建矩阵,每行包含多个图像