Видео OpenCV показывает только один кадр вместо непрерывного кадра

#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()