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<Mat>
而不是4D matrix
,但这个答案仅供那些真正需要在OpenCV 中使用4D
矩阵的人参考(即使这是一个非常不受支持、未记录和未探索的东西,在线可用的东西很少,并且声称工作得很好!)。
所以,假设您用2D
或3D
数据填充了vector<Mat> vec
,这些数据可以是CV_8U
、CV_32F
等。
创建 4D 矩阵的一种方法是
vector<int> dims = (int)vec.size(), vec[0].rows, vec[0].cols;
Mat m(dims, vec[0].type(), &vec[0]);
但是,当向量不连续时,这种方法会失败,这通常是大矩阵的情况。如果您对不连续矩阵执行此操作,当您想使用矩阵(即复制、克隆等)时,您将获得 segmentation fault
或 bad 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-Python实战——OpenCV简介与图像处理基础(万字总结,️建议收藏️)