Ich versuche mit opencv Frames zu finden, die mit einem Bild übereinstimmen. Ich möchte auch den Zeitrahmen finden, in dem das Bild gefunden wird. Das Video ist ein maskiertes Video. Der Code bisher:
def occurence_counter(self):
img = cv2.imread('ref_img.jpg', cv2.IMREAD_COLOR)
# shrink
img = cv2.resize(img, (10, 10))
# convert to b&w
img = color.rgb2gray(img)
similarities=[]
result=self.parse_video(img,str(self.lineEdit.text()).strip(),1,False)
print result
def parse_video(self,image, video, n_matches, break_point=False,
verbose=False):
similarities = [{'frame': 0, 'similarity': 0}]
frame_count = 0
cap = cv2.VideoCapture(video)
while (cap.isOpened()):
ret, frame = cap.read()
if (type(frame) == type(None)):
break
# increment frame counter
frame_count += 1
# resize current video frame
small_frame = cv2.resize(frame, (10, 10))
# convert to greyscale
small_frame_bw = color.rgb2gray(small_frame)
Dasselbe Bild zu finden, ist keine leichte Aufgabe. Es gibt viele mögliche Lösungen. Ich werde hier die möglichen Lösungen auf sehr allgemeine Weise beschreiben.
Template Matching ist ein Algorithmus, der die Ähnlichkeit der entsprechenden Pixel in den Bildern berechnet. Wenn Sie also ein sehr ähnliches Bild suchen (ohne Drehung, Übersetzung, große Intensitätsänderungen), ist es kein so schlechter Algorithmus. Es ist nicht so schnell für ganze Bilder. Es wird eher verwendet, um das gleiche Fragment auf mehreren Bildern oder ein kleineres Bild auf einem größeren Bild zu finden und nicht, um die Ähnlichkeit zweier Bilder zu überprüfen. https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html
Für ganze Bilder ist es einfacher, die Bilder einfach zu subtrahieren und dann die Vorlagenabstimmung zu verwenden. Es geht viel schneller. Es muss die Annahme bestehen, dass sie sich wirklich ähnlich sind.
Sie können den Histogrammvergleich verwenden. Es ist der schnellste Weg, aber nicht genau. Gras und Äpfel sind beide grün, unterscheiden sich jedoch voneinander. Wenn es um Farbe geht, ist es normalerweise besser, den HSV-Farbraum zu verwenden. https://docs.opencv.org/3.4.1/d8/dc8/tutorial_histogram_comparison.html
Der Algorithmus sucht nach ähnlichen charakteristischen Punkten auf Bildern. Es gibt viele Algorithmen, um Merkmale auf Bildern zu finden. Sie sollten unempfindlich gegenüber Maßstabsänderungen, Drehung usw. sein. Dies hängt jedoch vom Algorithmus für die Merkmalsextraktion ab. https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_meaning/py_features_meaning.html#features-meaning
Andere Algorithmen sind PSNR oder SSIM. Ich habe es noch nie benutzt, aber es wird verwendet, um die Ähnlichkeit für Original- und Unschärfebild oder für die Ähnlichkeit der gesamten Videosequenz zu berechnen. https://docs.opencv.org/3.4.2/d5/dc4/tutorial_video_input_psnr_ssim.html
Sie können auch versuchen, Hashes von Bildern zu vergleichen. Es ist ein sehr interessanter Algorithmus (für mich), aber nicht gut dokumentiert. https://www.pyimagesearch.com/2017/11/27/image-hashing-opencv-python/
Feature-Matching ist der am häufigsten verwendete Algorithmus für diesen Aufgabentyp. Der Grund dafür ist, dass Feature-Matching-Algorithmen ähnliche Bildfragmente erkennen können, wenn Bilder aus einem anderen Winkel unter anderen Bedingungen aufgenommen werden oder sich nur teilweise überlappen. Structure From Motion-Algorithmen verwenden häufig Feature-Matching. https://hub.packtpub.com/exploring-structure-motion-using-opencv/ Die Lösung des Problems hängt immer von den uns vorliegenden Daten ab. Es gibt also keine Antwort.
quelle