博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv cvCaptureFromAVI cvReleaseCapture thread failure
阅读量:4134 次
发布时间:2019-05-25

本文共 1117 字,大约阅读时间需要 3 分钟。

在Opencv中,使用cvCaptureFromAVI打开一个视频文件后,并使用cvReleaseCapture释放关闭它后,再开启一个线程使用cvCaptureFromAVI打开一个视频文件,此时就会出现错误,在调试中,执行这个“CvCapture *capture = cvCaptureFromAVI( m_strVideoPath ); ”语句后也会出现capture的内存取值为0x00000000,也就是在多线程中cvCaptureFromAVI不能多次使用, cvReleaseCapture这个语句没有彻底执行,后来查到"OpenCV在多线程下不能读取AVI视频新的解决办法" , 

"

之前OpenCV在多线程下读取AVI视频不奏效的问题解决了好久,后来不得已换成了AVI stream来解码。本以为是解决了,在我的笔记本上和台式机上都正常的运行,可是到了别人的XP系统中又不能运行了,这样才真正的涉及到本质问题,一样是不行的,为什么呢?查了很久,之前AVIFILEOPEN这个函数的返回值始终是-2147221008,可是都没有找到本质原因,后来才发现,要把这个代码换成16进制就可以搜索到很多相关的项目了。原来不是什么OpenCV的bug,是因为多线程使用前必须加一句CoInitialize(NULL);来对线程进行一个初始化。把这个简单的话加到AVIStream解码中和OpenCV解码的前面,发现这两种解码的方式都可以正常运行了。这个问题困扰了我好几天,却通过这么曲折的方式解决掉,实在让我有点意外。上网查了一下,发现这两个函数用来设置COM库的,可是我怎么知道OpenCV和AVIStream或者是XVID里面是否用到了COM库呢?哎,只能吃哑巴亏了,也不可能从头到尾去专研这个,毕竟只是一个工具而已,下次记住就OK了。
 
注:
CoInitialize是用来初始化COM库的;
CoUninitialize是用来对COM库做些清理工作的;
CoInitialize Function

Initializes the COM library on the current thread and identifies the concurrency model as single-thread apartment (STA).New applications should call  instead of CoInitialize.

"

也就是在线程处理函数中,分别在函数头和函数尾加上 CoInitialize(NULL); 和 CoUninitialize();  这样就可以在多线程下多次读取视频文件了。

转载地址:http://wrsvi.baihongyu.com/

你可能感兴趣的文章
DBCP——开源组件 的使用
查看>>
抓包工具
查看>>
海量数据相似度计算之simhash和海明距离
查看>>
DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
查看>>
DeepLearning tutorial(6)易用的深度学习框架Keras简介
查看>>
DeepLearning tutorial(7)深度学习框架Keras的使用-进阶
查看>>
流形学习-高维数据的降维与可视化
查看>>
Python-OpenCV人脸检测(代码)
查看>>
python+opencv之视频人脸识别
查看>>
人脸识别(OpenCV+Python)
查看>>
6个强大的AngularJS扩展应用
查看>>
网站用户登录系统设计——jsGen实现版
查看>>
第三方SDK:讯飞语音听写
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
自定义控件:飞入飞出的效果
查看>>
自定义控件:动态获取控件的高
查看>>
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>
第三方SDK:百度地图SDK的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>