opencv python多线程视频捕获
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了opencv python多线程视频捕获,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3445字,纯文字阅读大概需要5分钟。
内容图文
![opencv python多线程视频捕获](/upload/InfoBanner/zyjiaocheng/677/c8512a8df3304f98af44cb6389707788.jpg)
我正在尝试读取2个视频文件,并同时在单独的Windows中显示它们.
这是我的代码:
import threading
import cv2
threadLock=threading.Lock()
class myThread (threading.Thread):
maxRetries=20
def __init__(self, threadID, name,video_url):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.video_url=video_url
def attemptRead(self,cvVideo):
threadLock.acquire()
(isRead,cvImage)=cvVideo.read()
threadLock.release()
if isRead==False:
count=1
while isRead==False and count<myThread.maxRetries:
threadLock.acquire()
(isRead,cvImage)=cvVideo.read()
threadLock.release()
print self.name+' try no: ',count
count+=1
return (isRead,cvImage)
def run(self):
print "Starting " + self.name
windowName = self.name
cv2.namedWindow(windowName)
cvVideo = cv2.VideoCapture(self.video_url)
while True:
(isRead,cvImage)=self.attemptRead(cvVideo)
if isRead==False:
break
cv2.imshow(windowName,cvImage)
key=cv2.waitKey(50)
if key==27:
break
cv2.destroyWindow(windowName)
print self.name + "Exiting"
def main():
thread1 = myThread(1, "Thread1",'C:/Traffic Pics/Videos/Panjim Capture.mp4')
thread2 = myThread(2, "Thread2",'C:/Traffic Pics/Videos/Miramar Capture.mp4')
thread1.start()
thread2.start()
print "Exiting Main Thread"
if __name__ == '__main__':
main()
发生的是,仅显示“线程2”窗口.尝试读取超出max_retries限制(在我的情况下为10)的视频后,线程1退出.
问题是,尽管我创建了单独的cvVideo对象,但似乎无法同时使用它们.
可能是什么问题呢?
解决方法:
*编辑:我将在下面的代码,但我想你有一个编解码器问题?我安装了xvid编解码器(这是示例Megamind.avi的编码方式),并且该程序可以在运行megamind视频的一个或两个线程中正常运行.您能使megamind视频在单线程版本中运行吗?
如果有帮助,这里是an SO post on opencv video codecs.这是我使用的xvid download(k-lite不适用于我).
您编写的代码基本上对我有用.对于您和其他想要尝试的人,我做了以下工作:
>应用的PEP 8建议
>删除了不必要的读取尝试代码(这也删除了工作视频最后一帧之后的误导性线程重新读取警告)
>使用了一个视频文件,也许每个使用opencv的人都拥有
>至少在我的系统上删除了对opencv似乎无关紧要的线程锁定
>移动了其他一些小东西
VideoCapture.read可能会出现其他错误,这些错误使值得使用read_attempt方法,但我只能找到the two errors the docs mention.对于那些错误,它只返回false,而该代码已经过测试.
import os
import threading
import cv2
my_opencv_path = "C:/opencv2.4.3"
video_path_1 = os.path.join(my_opencv_path, "samples", "cpp", "tutorial_code",
"HighGUI", "video-input-psnr-ssim", "video",
"Megamind.avi")
video_path_2 = os.path.join(my_opencv_path, "samples", "c", "tree.avi")
assert os.path.isfile(video_path_1)
assert os.path.isfile(video_path_2)
class MyThread (threading.Thread):
maxRetries = 20
def __init__(self, thread_id, name, video_url, thread_lock):
threading.Thread.__init__(self)
self.thread_id = thread_id
self.name = name
self.video_url = video_url
self.thread_lock = thread_lock
def run(self):
print "Starting " + self.name
window_name = self.name
cv2.namedWindow(window_name)
video = cv2.VideoCapture(self.video_url)
while True:
# self.thread_lock.acquire() # These didn't seem necessary
got_a_frame, image = video.read()
# self.thread_lock.release()
if not got_a_frame: # error on video source or last frame finished
break
cv2.imshow(window_name, image)
key = cv2.waitKey(50)
if key == 27:
break
cv2.destroyWindow(window_name)
print self.name + " Exiting"
def main():
thread_lock = threading.Lock()
thread1 = MyThread(1, "Thread 1", video_path_1, thread_lock)
thread2 = MyThread(2, "Thread 2", video_path_2, thread_lock)
thread1.start()
thread2.start()
print "Exiting Main Thread"
if __name__ == '__main__':
main()
内容总结
以上是互联网集市为您收集整理的opencv python多线程视频捕获全部内容,希望文章能够帮你解决opencv python多线程视频捕获所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。