fmv*_*ior 5 c++ opencv c++-cli
我有一个c ++ - cli代码,它使用捕获从opencv文件夹中捕获视频,然后使用cvquery框架检索帧.然后我处理帧,一旦处理完所有帧,我就会释放捕获.它工作正常,但当我尝试多线程时,它给了我一个警告,无法捕获文件夹中的一些视频,警告"avcodec_open/close()周围的线程锁定不足".
//for each video in folder do
{
capture=cvCreateFileCapture(filename);
while(1)
{
img=cvqueryframe(capture)
if !img break;
///process img
}
cvreleasecapture(&capture);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法解决多线程的问题?我在考虑使用
while(!capture)
capture=cvCreateFileCapture(filename);
Run Code Online (Sandbox Code Playgroud)
但应该有一个更有效的方法,可能使用锁定Monitor :: Enter(obj)或锁定(obj)?
Mig*_*uel 10
avcodec中的open
和close
函数不是线程安全的.为了防止多线程应用程序中的问题,他们有一个简单的机制,可以检测两个线程何时同时在这些函数中,并且当发生这种情况时,它们会编写"不足的线程锁定"消息.
阻止此消息的方法是将调用锁定到cvCreateFileCapture
和cvreleasecapture
(进而调用avcodec_open
和avcodec_close
)以确保始终序列化这些调用.例如,如果你有一个名为Mutex的互斥类,你可以这样做:
extern Mutex m; // application-wide mutex
//for each video in folder do
{
m.lock();
capture=cvCreateFileCapture(filename);
m.unlock();
while(1)
{
img=cvqueryframe(capture)
if !img break;
///process img
}
m.lock();
cvreleasecapture(&capture);
m.unlock();
}
Run Code Online (Sandbox Code Playgroud)
有许多Mutex实现.在Linux或OS X上,您可以使用pthread互斥锁.在Windows上,您可以使用Win32互斥锁.
归档时间: |
|
查看次数: |
3578 次 |
最近记录: |