В настоящее время я работаю над проектом, который принимает видеофайл, читает отдельные кадры в градациях серого, нормализует их, пороговые значения, а затем выводит их в виде отдельных файлов .jpg. Ниже у меня есть две функции, frameCapture()
и frameCaptureMulti()
. Первый использует cv2.threshold
и cv2.THRESH_OTSU
и работает как задумано. Последний использует threshold_multiotsu()
из skimage.filters
и выводит полностью черные кадры.
import cv2
import numpy as np
from skimage.filters import threshold_multiotsu
def frameCapture(fc_path):
fc_vidObj = cv2.VideoCapture(fc_path) # Path to video file
fc_count = 0 # Used as counter variable
fc_success = 1 # Checks if the frames were extracted
while fc_success:
# vidObj object calls read
fc_success, fc_image = fc_vidObj.read()
fc_image = cv2.cvtColor(fc_image, cv2.COLOR_BGR2GRAY) # Convert the image to grayscale
fc_image = cv2.GaussianBlur(fc_image,(5,5),0) # Gaussian noise filtering
(threshold, fc_image) = cv2.threshold(fc_image, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # Normalize & Segment
cv2.imwrite("frame%d.jpg" % fc_count, fc_image) # Saves the frames
fc_count += 1
def frameCaptureMulti(fc_path):
fc_vidObj = cv2.VideoCapture(fc_path) # Path to video file
fc_count = 0 # Used as counter variable
fc_success = 1 # Checks if the frames were extracted
while fc_success:
# vidObj object calls read
fc_success, fc_image = fc_vidObj.read()
fc_image = cv2.cvtColor(fc_image, cv2.COLOR_BGR2GRAY) # Convert the image to grayscale
fc_image = cv2.GaussianBlur(fc_image,(5,5),0) # Gaussian noise filtering
fc_thresholds = threshold_multiotsu(fc_image)
fc_regions = np.digitize(fc_image, bins=fc_thresholds)
cv2.imwrite("frame%d.jpg" % fc_count, fc_regions) # Saves the frames
fc_count += 1
Код драйвера просто запускает frameCaptureMulti () для файла .mp4 на моем компьютере.
Вот как выглядят кадры: frameCapture()
вывод
frameCaptureMulti()
вывод:
Я не уверен, почему frameCaptureMulti()
производит чистый черный цвет кадры. У меня есть только несколько недель опыта работы с Python (за исключением обучения около десяти лет go) и даже меньше с этими конкретными библиотеками, поэтому любая помощь в том, почему мой код не выдает ожидаемый результат, приветствуется.
Страницы, на которые ссылаются части кода в frameCapture и frameCaptureMulti: https://scikit-image.org/docs/dev/auto_examples/segmentation/plot_multiotsu.html https://www.geeksforgeeks.org/python-program-extract-frames-using-opencv/