OpenCV图像阵列,4D矩阵

时间:2011-12-05 13:48:18

标签: c++ c opencv matrix

我正在尝试将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复制到存储位置?

e.g。 cvImageBucket(:,:,:,0) = matImage; // copied first image into array

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

我猜的是类似的东西:

for ith matImage

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

答案 2 :(得分:0)

尽管我同意@Chris的观点,但最好使用vector<Mat>而不是4D matrix,但此答案仅供那些确实需要使用{{1 }}在OpenCV中使用矩阵(尽管它是一种不受支持,没有文档记录且尚未开发的东西,在线可用量很少,并且声称工作正常!)。

因此,假设您用4Dvector<Mat> vec数据填充了2D,这些数据可以是3DCV_8U等。

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

CV_32F

但是,当向量不连续时,此方法会失败,这通常是大矩阵的情况。如果您对不连续的矩阵执行此操作,则在您要使用矩阵(即复制,克隆等)时会得到vector<int> dims = {(int)vec.size(), vec[0].rows, vec[0].cols}; Mat m(dims, vec[0].type(), &vec[0]); segmentation fault。为了克服这个问题,您可以按如下方式将向量矩阵一一复制到4D矩阵中:

bad access error

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

另外,请注意,您始终可以使用Mat m2(dims, vec[0].type()); for (auto i = 0; i < vec.size(); i++){ vec[i].copyTo(temp.at<Mat>(i)); } ,但通常for loops时最好不要使用它们。