OpenCV-创建材质对象阵列
OpenCV - Creating an Array of Mat Objects
我本以为这很琐碎,但我遇到了一些麻烦。
我想把一个视频文件读入内存,并把它存储在一个数组中。我希望数组是指向Mat对象的指针。
这是我正在使用的代码:
cv::VideoCapture vidCap = cv::VideoCapture("file.avi");
int frames = (int)vidCap.get(CV_CAP_PROP_FRAME_COUNT);
cv::Mat** frameArray = new cv::Mat*[frames];
for (int num = 0; num < frames; num++) {
frameArray[num] = new cv::Mat;
vidCap >> *(frameArray[num]);
}
但是,当我显示一个图像(例如,阵列中的第一个图像)时,它会显示最后帧。我哪里错了?这是显示图像的代码:
cv::namedWindow("Movie", 1);
cv::imshow("Movie", *(frameArray[0]));
cv::waitKey(0);
我可以想象,由于它显示的是最后一个图像,数组中的所有指针都是相同的,因此,它修改的是相同的内存。然而,当我打印指针时,它们是不同的。
您的代码中还有更多的缺陷。其中至少有两个是:
-
vidCap.get(CV_CAP_PROP_FRAME_COUNT);
在大多数情况下不会返回正确的帧数。就是这样,ffmpeg做得再好不过了。对于某些编解码器来说,它是有效的,对于某些编解码来说,它不起作用。 -
Mat矩阵有一个有趣的行为。它们实际上是指向矩阵数据的指针,而不是对象。当你说
new Mat
时,你只是创建了一个新的指针。再加上videoCap始终返回相同的内存区域,只返回新数据,您实际上会有一个指向最后一帧的指针向量。
您必须在单独的图像中捕获帧,并将其复制到保留位置:
std::vector<cv::Mat> frames;
cap >> frame;
frames.push_back(frame.clone());
请注意从指针数组到对象向量的变化。这避免了事先读取帧数的需要,也使代码更加安全。
但实际上有创建Mat数组的方法吗?在我的情况下,我真的看不到其他选项,但试图访问数组中的一个项会将数组视为一个Mat,并认为我正在尝试访问它的数据。
编辑:使用指针找到了一个解决方法:
Mat* array = new Mat[arraySize];
相关文章:
- 什么时候调用组成单元对象的析构函数
- 完美的对象转发阵列
- C 中的对象的多维阵列
- 如何保存模板的对象阵列进行文件
- 指针阵列在一个对象数组中函数
- C 对象阵列删除一个
- 在阵列中向上移动对象
- 将指针添加到成员对象中的指针动态阵列
- 2D 阵列/网格中的对象移动
- 存储2D对象阵列的最佳方法是什么
- 为三维阵列中的特定图元创建对象
- 如何使用“顶点阵列”对象
- visual C++新与Malloc的对象动态内存阵列
- 旋转顶点阵列对象不起作用
- 多暗对象的多暗阵列和仅包含一个暗对象的一个较高暗的阵列之间的区别是什么
- 用于融合对象阵列的通用函数
- OpenCV-创建材质对象阵列
- 从对象阵列中选择一个随机对象
- 基于组件的游戏对象的阵列和地图之间的优点和缺点
- 2D对象阵列内存问题C++