感谢阅读我的文章。
我在对 opencv 应用程序进行多线程处理时遇到问题,希望你们能帮我解决。
我的目标是从视频序列的中间保存 400 帧(jpeg 格式)以供进一步检查。
我的代码单线程运行良好,但多线程导致了很多问题,所以我想知道我的理念是否完全错误。
就我应该做什么的示意图而言,我最好:
选项 1:以某种方式同时访问单个视频文件(或制作拷贝?),然后让各个线程逐帧循环播放视频,在预定限制之间保存每一帧?例如。线程 1 保存第 50 到 100 帧,线程 2 保存第 101 到 150 帧等。
选项 2:打开文件一次,逐帧循环,然后将单个帧传递给一系列独特的线程以执行保存操作。例如。帧 1 传递给线程 1 进行保存,帧 2 传递给线程 2 进行保存,帧 3 传递给线程 1,帧 4 传递给线程 2 等等。
选项 3:一些其他的缓冲区/线程安排,这比上面的想法更好!
我正在使用带有标准库的 Visual C++。
非常感谢您对此的帮助,
干杯,凯
最佳答案
Option 1 is what i have tried to do this far, but because of the errors, i was wondering if it was even possible to do this! Can threads usually access the same file? how do I find out how many threads i can have?
当然,不同的线程可以访问同一个文件,但支持库是否支持这确实是个问题。要读取视频流,您可以使用 OpenCV 或 ffmpeg(例如,您可以在同一个应用程序中使用两者,ffmpeg 用于读取,OpenCV 用于处理)。还没有看过文档,所以我在这里猜测:lib 应该允许多个读者访问同一个文件。
要找出核心数:
SYSTEM_INFO sysinfo;
GetSystemInfo( &sysinfo );
numCPU = sysinfo.dwNumberOfProcessors;
来自 this post .您可以创建一个线程/核心作为起点,然后根据您的性能需求和实际测试更改数量。
关于c++ - 多线程 OpenCV 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17448306/