weixin_68179420 2023-04-09 23:11 采纳率: 100%
浏览 65
已结题

在使用python使用threading、os、cv2进行多线程文件的图像的获取存储、读取、删除的过程中,遇到了一些无法解决的问题

在使用python使用threading、os、cv2进行多线程文件的图像的获取存储、读取、删除的过程中,遇到了一些无法解决的问题:
代码如下:

import cv2
import  time
import  threading
import os

#从电脑摄像头获取图片并存储
def cunchu():
 cap = cv2.VideoCapture(0)
 success,x_img=cap.read()
 cv2.imwrite(os.path.join('C:\\Users\\10605\\Desktop\\wjj','1.png'), x_img)

#读取图片
def duqv():
     img = cv2.imread('C:\\Users\\10605\\Desktop\\wjj\\1.png')
     cv2.imshow("img", img)
     cv2.waitKey(1)

#删除图片
def shanchu():
    os.remove('C:\\Users\\10605\\Desktop\\wjj\\1.png')

if __name__== '__main__':

    cunchu1 = threading.Thread(target=cunchu)
    duqv1 = threading.Thread(target=duqv)
    shanchu1 = threading.Thread(target=shanchu)

    cunchu1.start()
    time.sleep(1)
    print("1")
    duqv1.start()
    time.sleep(2)
    print("2")
    shanchu1.start()
    time.sleep(1)
    print("3")

报错如下

C:\Users\10605\Desktop\venv\Scripts\python.exe C:/Users/10605/Desktop/venv/图片实验.py 
1
[ WARN:0@1.422] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('C:\Users\10605\Desktop\wjj\1.png'): can't open/read file: check file path/integrity
Exception in thread Thread-2 (duqv):
Traceback (most recent call last):
  File "C:\Users\10605\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1009, in _bootstrap_inner
    self.run()
  File "C:\Users\10605\AppData\Local\Programs\Python\Python310\lib\threading.py", line 946, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\10605\Desktop\venv\图片实验.py", line 15, in duqv
    cv2.imshow("img", img)
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

2
3

进程已结束,退出代码0
  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2023-04-09 23:31
    关注

    以下内容部分参考ChatGPT模型:


    问题分析:在多线程操作中,由于线程间的并发执行,可能会导致某些操作的顺序出现问题,比如在duqv线程中读取图片时,可能会出现文件不存在的情况,因为cunchu线程还没有完成图片的存储就被duqv线程读取了。另外,在删除图片时也需要注意,可能会出现文件不存在的情况,因为shanchu线程可能会先于cunchu线程执行,导致文件还没有创建就被删除了。

    解决思路:可以使用线程同步的方式来解决这个问题,比如使用锁来保证cunchu线程完成图片存储后再执行duqv线程,使用条件变量来保证cunchu线程完成图片存储后再执行shanchu线程。另外,可以使用异常处理来捕获文件不存在等异常情况。

    代码如下:

    import cv2
    import time
    import threading
    import os
    
    
    #从电脑摄像头获取图片并存储
    def cunchu(lock, event):
        cap = cv2.VideoCapture(0)
        success, x_img = cap.read()
        cv2.imwrite(os.path.join('C:\\Users\\10605\\Desktop\\wjj','1.png'), x_img)
        event.set()
        lock.release()
    
    
    #读取图片
    def duqv(lock, event):
        event.wait()
        lock.acquire()
        try:
            img = cv2.imread('C:\\Users\\10605\\Desktop\\wjj\\1.png')
            cv2.imshow("img", img)
            cv2.waitKey(0)
        except Exception as e:
            print(e)
        finally:
            lock.release()
    
    
    #删除图片
    def shanchu(lock, event):
        event.wait()
        lock.acquire()
        try:
            os.remove('C:\\Users\\10605\\Desktop\\wjj\\1.png')
        except Exception as e:
            print(e)
        finally:
            lock.release()
    
    
    if __name__ == '__main__':
        lock = threading.Lock()
        event = threading.Event()
    
        cunchu1 = threading.Thread(target=cunchu, args=(lock, event))
        duqv1 = threading.Thread(target=duqv, args=(lock, event))
        shanchu1 = threading.Thread(target=shanchu, args=(lock, event))
    
        lock.acquire()
        cunchu1.start()
        duqv1.start()
        shanchu1.start()
    

    在这个例子中,我们使用了线程同步的方式来保证cunchu线程完成图片存储后再执行duqv线程和shanchu线程,具体的方法是使用锁和条件变量。首先,我们创建了一个锁和一个条件变量,然后在cunchu线程中,当图片存储完成后,我们使用event.set()来设置条件变量,表示图片已经存储完成;然后使用lock.release()来释放锁。在duqv线程和shanchu线程中,我们先使用event.wait()来等待条件变量被设置,表示图片已经存储完成;然后使用lock.acquire()来获取锁,保证线程同步。在读取图片和删除图片时,我们使用了异常处理来避免文件不存在等异常情况。


    如果我的建议对您有帮助、请点击采纳、祝您生活愉快

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月11日
  • 已采纳回答 4月10日
  • 创建了问题 4月9日

悬赏问题

  • ¥15 关于#网络安全#的问题:求ensp的网络安全,不要步骤要完成版文件
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥20 使用Photon PUN2解决游戏得分同步的问题
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序