Suchen Sie nach Frames in einem Video, das einem Bild entspricht

-1

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)
Ramakanta Chandra
quelle

Antworten:

1

Wenn ich mich nicht irre , was Sie tun wollen , heißt Template Matching können Sie opencv Tutorial dieser Funktion finden Sie hier . Auch dieser Thread könnte für Sie nützlich sein, insbesondere @Sam answer, in dem neben Template Matching auch Compareing Histograms und Feature Matching beschrieben werden .

Daweo
quelle
2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. - Aus der Bewertung
scotty3785
@ scotty3785 Dieser Beitrag erfüllt nicht die Kriterien für eine Nur-Link-Antwort, da er noch einige nützliche Informationen enthält, wenn Sie die Links entfernen: die Tatsache, dass dies als Template Matching bezeichnet wird. Auch wenn die Links ausfallen, gibt es hier noch einige Informationen.
EJoshuaS
0

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

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.

Histogramm-Vergleich

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

Feature-Matching

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 Alogithmen

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.

Piotr Kurowski
quelle