程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了opencv python多线程视频捕获大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决opencv python多线程视频捕获?

开发过程中遇到opencv python多线程视频捕获的问题如何解决?下面主要结合日常开发的经验,给出你关于opencv python多线程视频捕获的解决方法建议,希望对你解决opencv python多线程视频捕获有所启发或帮助;

*编辑:我将在下面保留代码,但是我想您有编解码器问题吗?我安装了xvID编解码器(这是示例Megamind.avi的编码方式),并且该程序可以在运行megamind视频的一个或两个线程中正常运行。您能使megamind视频在单线程版本中运行吗?

如果有帮助,这是有关opencv视频编解码器的文章。这是我使用的xvid下载(k-lite不适用于我)。

您编写的代码基本上对我有用。对于您和其他想要尝试的人,@R_761_10673@下工作:

  • 应用的PEP 8建议
  • 删除了不必要的读取尝试代码(也删除了工作视频最后一帧之后的误导性线程重新读取警告)
  • 使用了一个视频文件,也许每个使用opencv的人都拥有
  • 至少在我的系统上删除了对opencv似乎无关紧要的线程锁定
  • 移动了其他一些小东西

VIDeoCapture.read可能还会出现其他错误,这些错误使值得使用read_attempt方法,但我只能找到文档中提到的两个错误。对于那些,它只返回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 @R_197_9016@e 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()

解决方法

我正在尝试读取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 窗口 中显示 。尝试读取超出 @H_701_37@max_retries限制
(在我的情况下为10)的视频后, 线程1退出 。问题是,尽管我创建了单独的 cvVideo 对象,但似乎无法同时使用它们。可能是什么问题呢?


大佬总结

以上是大佬教程为你收集整理的opencv python多线程视频捕获全部内容,希望文章能够帮你解决opencv python多线程视频捕获所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。