V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
itIsUnbelievable
V2EX  ›  问与答

关于 opencv 的一个错误问题(Raw image encoder error: Empty JPEG image)

  •  
  •   itIsUnbelievable · 2019-08-25 21:35:23 +08:00 · 3569 次点击
    这是一个创建于 1677 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Traceback (most recent call last):
      File "c:\Users\Administrator\Desktop\pyqt_baiduyun\baiduyun1.py", line 111, in run
        cut_img=get_faceimg(frame,i,face_list)              #注册用的剪切后的人脸照片
      File "c:\Users\Administrator\Desktop\pyqt_baiduyun\utils\utils.py", line 156, in get_faceimg
        cut_img_str = cv2.imencode('.jpg', cutImg)[1].tostring()
    cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgcodecs\src\grfmt_base.cpp:145: error: (-10:Unknown error code -10) Raw image encoder error: Empty JPEG image (DNL not supported) in function 'cv::BaseImageEncoder::throwOnEror'
    

    -----------------------分割线--------------------------------
    156 行的函数如下:

    #获取人脸裁剪图片
    def get_faceimg(frame,i,face_list):
        width,top,left,height=get_face_location(i,face_list)        #获取人脸的左顶点坐标和长宽。
        cutImg = frame[top:top+height,left:left+width]             #[y1:y2,x1:x2]切片
        cut_img_str = cv2.imencode('.jpg', cutImg)[1].tostring()  # 将图片编码成流数据,放到内存缓存中,然后转化成 string 格式
        cut_img = str(base64.b64encode(cut_img_str),'utf-8') # 编码成 base64
        return cut_img
    

    -----------------------分割线--------------------------------
    请问各位老哥这个错误是什么原因呢? 我在 pyqt 里多线程同时调用 opencv 的 videocapture()读取视频的每一帧,对每一帧进行处理。结果经常随机性地报这个错误,google 了没找到合适的解释,下面这篇感觉比较符合: https://www.cnblogs.com/hul201610101100/p/10233211.html
    但是还是不知道如何修改,希望各位老哥给支个招。

    7 条回复    2019-12-26 15:39:13 +08:00
    minami
        1
    minami  
       2019-08-25 21:52:09 +08:00
    把 width,top,left,height 打出来看看吧,可能是获取的宽高非法,导致取不到图片
    Hconk
        2
    Hconk  
       2019-08-25 22:00:51 +08:00 via iPhone
    在你的 get_faceimg 函数开头判断下 frame 是不是为空,为空就跳过去,概率性的话我猜可能和相机驱动或者相机参数设置有些关系,只是猜测可以检查下。
    itIsUnbelievable
        3
    itIsUnbelievable  
    OP
       2019-08-25 22:33:10 +08:00
    @minami 这个没问题,因为是对一个视频一直取帧,一般是正常运行了一段时间然后才报这个错,前面图片截取都是正常的。
    itIsUnbelievable
        4
    itIsUnbelievable  
    OP
       2019-08-25 22:34:39 +08:00
    @Hconk
    while(True):
    ret,frame = cap.read()
    itIsUnbelievable
        5
    itIsUnbelievable  
    OP
       2019-08-25 22:39:17 +08:00
    @itIsUnbelievable 刚才手快按出去了,尴尬。。。
    while(True):
    ret,frame = cap.read()
    if ret is True:
    pass
    这里我有判断,如果是这里的问题那为何最开始不报错,到后面才报错呢?
    而且我目前读取的是本地视频文件,还没用到摄像头
    bigNewsMaker
        6
    bigNewsMaker  
       2019-12-26 15:33:24 +08:00
    楼主解决了吗?@ itIsUnbelievable,我最近也碰到这个错误了。
    用 cv2.imread 读入图片,然后使用 cv2.imencode 编码时,也报出这个错。
    bigNewsMaker
        7
    bigNewsMaker  
       2019-12-26 15:39:13 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1022 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:57 · PVG 03:57 · LAX 12:57 · JFK 15:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.