_src.empty() в функции ‘cv::cvtColor

#python #opencv #opencv-python

#python #opencv #opencv-python

Вопрос:

В этом коде нет ничего плохого, за исключением того, что я продолжаю получать эту ошибку.

 rgb_frame =cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
cv2.error: OpenCV(4.4.0) C:UsersappveyorAppDataLocalTemp1pip-req-build-2b5g8ysbopencvmodulesimgprocsrccolor.cpp:182: 
error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'  
 

Я погуглил эту ошибку, и мне сказали проверить, хорошо ли сохранены кадры. Я проверил, и все было в порядке. Также они сказали мне проверить path 'video3.mp4' . Я сохранил видео в той же папке, что и этот файл python.

Кто-нибудь может сказать, почему я продолжаю получать эту ошибку?

 import cv2
import openpyxl


cap = cv2.VideoCapture('video3.mp4')    


wb= openpyxl.Workbook()
sheet= wb.active

a=1
b=1


while(1):

     _, frame = cap.read()
    frame_pos=cap.get(cv2.CAP_PROP_POS_FRAMES)

    #error here!
    rgb_frame =cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
    hsv_frame01=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    
    

    ycrb_frame=cv2.cvtColor(frame,cv2.COLOR_BGR2YCrCb)
    planes=cv2.split(ycrb_frame)
    planes[0]=cv2.equalizeHist(planes[0])
    dst_ycrb=cv2.merge(planes)


    dst=cv2.cvtColor(dst_ycrb,cv2.COLOR_YCrCb2BGR)
    hsv_frame = cv2.cvtColor(dst, cv2.COLOR_BGR2HSV)



    lower_hsv = cv2.inRange(hsv_frame, (30, 150, 50), (255, 255, 180))
    upper_hsv = cv2.inRange(hsv_frame, (0, 70,100), (10, 255, 255))   
    added_hsv = cv2.addWeighted(lower_hsv, 1.0, upper_hsv, 1.0, 0.0)


    se=cv2.getStructuringElement(cv2.MORPH_RECT,(5,3))   

    bi=cv2.medianBlur(added_hsv,3)
    dilate=cv2.dilate(bi,se,iterations=6)



    res = cv2.bitwise_and(frame, frame, mask=dilate)


    contours, _ = cv2.findContours(dilate,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 


    for i in contours:
        M=cv2.moments(i)     
    
    
        cy=int(M['m01']/M['m00'])
        cx=int(M['m10']/M['m00'])
       
        cv2.drawContours(res,[i],0,(255,0,0),3)
        cv2.circle(res,(cx,cy),3,(255,0,0),-1)
   
    
        if frame_pos>=285 and cy<320:
            text1='RGB : '   str(rgb_frame[cy,cx])
            text2='HSV : '   str(hsv_frame01[cy,cx])
            cv2.putText(res,text1,(cx-200 ,cy),cv2.FONT_HERSHEY_PLAIN,1 ,(255,255,255))
            cv2.putText(res,text2,(cx-200 ,cy-30),cv2.FONT_HERSHEY_PLAIN,1 ,(255,255,255))
            if cx<=427:
                sheet.cell(row=a,column=1).value=str(rgb_frame[cy,cx])
                a=a 1
           
                   
            else:
                sheet.cell(row=b,column=2).value=str(rgb_frame[cy,cx])
                b=b 1
           
 
        elif 350<= cy <=400 :    
            text1='RGB : '   str(rgb_frame[cy,cx])
            text2='HSV : '   str(hsv_frame01[cy,cx])
        
            cv2.putText(res,text1,(cx-200 ,cy),cv2.FONT_HERSHEY_PLAIN,1 ,(255,255,255))
            cv2.putText(res,text2,(cx-200 ,cy-30),cv2.FONT_HERSHEY_PLAIN,1 ,(255,255,255))

            if cx<=427:
                sheet.cell(row=a,column=1).value=str(rgb_frame[cy,cx])
                a=a 1
            else:
                sheet.cell(row=b,column=2).value=str(rgb_frame[cy,cx])
                b=b 1 
       
    
    wb.save('1.xlsx')
    cv2.namedWindow('frame',cv2.WINDOW_NORMAL)
    cv2.namedWindow('added_hsv',cv2.WINDOW_NORMAL)
    cv2.namedWindow('res',cv2.WINDOW_NORMAL)


    cv2.imshow('frame',frame)
    cv2.imshow('added_hsv',added_hsv)
    cv2.imshow('res',res)

    if cv2.waitKey(5)>0:
        break   

cv2.destroyAllWindows() 
 

Комментарии:

1. вероятно, у него была проблема с чтением фрейма из файла, а теперь frame есть None , и он не может изменить цвета None . Вы должны запускать код только в if frame is not None:

2. может быть , использовать C:fullpathtovideo3.mp4 . Иногда код может быть выполнен с другим «Текущим рабочим каталогом», и он может искать видео в другой папке, чем вы ожидаете, и может не найти ваше видео.

3. @furas Я добавил ‘if frame is None: print (‘ошибка загрузки изображения не удалась’) break’ и я изменил путь. Но результат был странным. Я распечатал одно сообщение «ошибка загрузки изображения», и 3 окна работали отлично

4. Я не понимаю, почему он отображает окна, если вы используете break для выхода из этого цикла. Возможно break , имеет неправильный отступ. Вы можете добавить больше print() в других местах, чтобы увидеть, какая часть выполняется — она вызывается print debuging — или узнать, как использовать настоящий отладчик.

5. @furas Спасибо за ответ! Видео состоит из 290 кадров. Я попробовал отладку печати и обнаружил, что она отлично отображает Windows, потому что «ошибка загрузки изображения» напечатана, когда это был последний кадр (290). Я все еще не понимаю, почему последний кадр не может преобразовать цвет.