#python #opencv #computer-vision #opencv3.0
Вопрос:
Когда я пытаюсь экспортировать следующее видео, оно показывает только один кадр в течение 12 секунд, я хочу показать исходное видео, но оно показывает только один кадр
Ниже приведен прилагаемый код:
ret, frame = day_video.read() height, width = frame.shape[:2] fourcc = cv2.VideoWriter_fourcc(*'MJPG') out = cv2.VideoWriter('output_day.avi', fourcc, 20, (width,height)) while day_video.isOpened(): ret, frame = day_video.read() if not ret: out.release() break new_output = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR) out.write(new_output) out.release()```
На выходе я получаю только один и тот же кадр в течение 12 секунд. [![Вывод образца][1]][1]
Код, который я использую для улучшения оригинального оформления
cap = cv2.VideoCapture('/content/drive/Shareddrives/Computer Vision/Assignment 2/Q1_day_video.avi') while(cap.isOpened()): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) sobelx = cv2.Sobel(gray, cv2.CV_8U, 1, 0) sobely = cv2.Sobel(gray, cv2.CV_8U, 0, 1) sobel_all = cv2.add(sobelx, sobely) (ret_otsu,thresh_otsu) = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) print(ret_otsu) # add the threshold effect with sobel filter result = cv2.add(sobel_all, thresh_otsu) cv2_imshow(result) break cap.release() cv2.destroyAllWindows()
Следующие изменения я внес, но они просто продолжают бесконечно загружаться
cap = cv2.VideoCapture('/content/drive/Shareddrives/Computer Vision/Assignment 2/Q1_day_video.avi') ret, frame = cap.read() height, width, _ = frame.shape gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) fourcc = cv2.VideoWriter_fourcc(*'MJPG') out = cv2.VideoWriter('output_day.avi', fourcc, 20, (width,height)) while(cap.isOpened()): ret, frame = cap.read() sobelx = cv2.Sobel(gray, cv2.CV_8U, 1, 0) sobely = cv2.Sobel(gray, cv2.CV_8U, 0, 1) sobel_all = cv2.add(sobelx, sobely) (ret_otsu,thresh_otsu) = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # add the threshold effect with sobel filter result = cv2.add(sobel_all, thresh_otsu) new_output = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR) new2_output = new2_output new_output if not ret: out.release() break out.write(new3_output) cap.release()``` [1]: https://i.stack.imgur.com/N0wCx.png
Комментарии:
1.Вы разрываете цикл после первого видеокадра… Замените
break
послеcv2_imshow(result)
наif not ret:
break
. Где осуществляется реализацияcv2_imshow
? Это должно быть что-то вродеcv2.imshow('result', result)
cv2.waitKey(1)
2.
while(cap.isOpened()): ret, frame = cap.read() sobelx = cv2.Sobel(gray, cv2.CV_8U, 1, 0) sobely = cv2.Sobel(gray, cv2.CV_8U, 0, 1) sobel_all = cv2.add(sobelx, sobely) (ret_otsu,thresh_otsu) = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) result = cv2.add(sobel_all, thresh_otsu) new_output = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR) new2_output = new2_output new_output if not ret: out.release() break out.write(new3_output) cap.release()
он просто продолжает бесконечно загружаться, я допустил ошибку в какой-то конкретной части?3. @Rotem, cv_imshow-это замена colabs (не могу использовать графический интерфейс opencv там)
Ответ №1:
Ваш последний блок кода загружается бесконечно, потому что ваш оператор break имеет неправильный отступ — он должен находиться внутри цикла while. Кроме того, вы применяете фильтр собеля только к первому кадру и всегда записываете этот кадр в финальное видео. Вам нужно расположить логические операторы в том порядке, в котором вы хотите, чтобы они выполнялись.
Ваш код:
cap = cv2.VideoCapture('/content/drive/Shareddrives/Computer Vision/Assignment 2/Q1_day_video.avi') ret, frame = cap.read() height, width, _ = frame.shape gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) fourcc = cv2.VideoWriter_fourcc(*'MJPG') out = cv2.VideoWriter('output_day.avi', fourcc, 20, (width,height)) while(cap.isOpened()): ret, frame = cap.read() sobelx = cv2.Sobel(gray, cv2.CV_8U, 1, 0) sobely = cv2.Sobel(gray, cv2.CV_8U, 0, 1) sobel_all = cv2.add(sobelx, sobely) (ret_otsu,thresh_otsu) = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # add the threshold effect with sobel filter result = cv2.add(sobel_all, thresh_otsu) new_output = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR) new2_output = new2_output new_output if not ret: out.release() break out.write(new3_output) cap.release()
Правильный код:
cap = cv2.VideoCapture('/content/drive/Shareddrives/Computer Vision/Assignment 2/Q1_day_video.avi') fourcc = cv2.VideoWriter_fourcc(*'MJPG') out = cv2.VideoWriter('output_day.avi', fourcc, 20, (width,height)) while(cap.isOpened()): ret, frame = cap.read() if not ret: out.release() break height, width, _ = frame.shape gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) sobelx = cv2.Sobel(gray, cv2.CV_8U, 1, 0) sobely = cv2.Sobel(gray, cv2.CV_8U, 0, 1) sobel_all = cv2.add(sobelx, sobely) (ret_otsu,thresh_otsu) = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # add the threshold effect with sobel filter result = cv2.add(sobel_all, thresh_otsu) new_output = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR) new2_output = new2_output new_output out.write(new2_output) cap.release()