gpt4 book ai didi

c++ - 创建一个小的 cv::Mat 列表并对其进行迭代的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 23:07:49 32 4
gpt4 key购买 nike

我是 C++ 的新手,我正在尝试创建一个 cv::Mat 列表。

这可能会分配相当多的内存,但我只有大约十个小垫子可以加载到列表中。

我编写了这段代码,但不确定为什么它不起作用。

void Utils::getFramesFromVideo(std::string file,std::list<cv::Mat>& listMatOutput) {

cv::VideoCapture* videoCapture = new cv::VideoCapture(file);

bool hasImage = false;

cvNamedWindow("WhileReading", 1);

do {
cv::Mat frame;
hasImage = videoCapture->read(frame);
if (hasImage) {
listMatOutput.push_back(frame);
imshow("WhileReading", frame);
waitKey(0);//give some time to see the frame (debug)
}
} while (hasImage);

cvNamedWindow("AfterReading", 2);

for (std::list<Mat>::const_iterator iterator = listMatOutput.begin();
iterator != listMatOutput.end(); iterator++) {
imshow("AfterReading", *iterator);
waitKey(0);//give some time to see the frame (debug)
}
videoCapture->release();
}

第一次加载正确显示帧,但在第二个窗口(AfterReading)中图像为黑色并带有红色条纹。有人可以给点建议吗?

最佳答案

列表格式是一个 STL 容器,这意味着您在使用它时需要牢记一些事项。 push_back()是向容器添加实例的首选方法,就像使用迭代器是访问列表元素的首选方法一样。如果您尝试直接将列表的元素设置为 cv::Mat()如果你正在处理,那么 a) 你需要确切地知道列表对每个实例做了什么样的包装,这样你就可以自己正确地做,并且 b) 你正在破坏在首先,这是抽象出列表的细节。

您不一定需要使用 frame.clone()调用您的代码,因为这会创建图像的深层拷贝并占用宝贵的资源。我知道我用过 std::vector<cv::Mat>过去不必为 vector 中的每个元素进行深度复制,所以我假设您应该能够将 Mat 本身传递给列表。咨询the C++ documentation on STL lists .

您可能会考虑的另一件事是,如果低内存使用率和通过列表的访问速度是一个问题,并且您的图像数量很少,那么是图像指针列表。将您的图像单独存储 cv::Mat实例,并列出类型 std::list<cv::Mat*> , 将图像的句柄传递给 push_back()称呼。当然,使用这种方法,您的图像将不是“线程安全的”,因为它们将存储在一个地方,但从另一个地方调用和处理。我希望这对您的询问有所帮助。

关于c++ - 创建一个小的 cv::Mat 列表并对其进行迭代的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11463613/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com