我正在尝试将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
答案 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中使用矩阵(尽管它是一种不受支持,没有文档记录且尚未开发的东西,在线可用量很少,并且声称工作正常!)。
因此,假设您用4D
或vector<Mat> vec
数据填充了2D
,这些数据可以是3D
,CV_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
时最好不要使用它们。