#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). Я все еще не понимаю, почему последний кадр не может преобразовать цвет.