我正在尝试使用opencv查找与图像匹配的帧。我也想找到找到图像的时间范围。该视频是被遮罩的视频。到目前为止的代码:
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)
答案 0 :(得分:1)
答案 1 :(得分:0)
找到相同的框架并不是一件容易的事。有许多可能的解决方案。在这里,我将以非常笼统的方式描述这些可能的解决方案。
模板匹配
模板匹配是一种算法,可计算图像中相应像素的相似度。因此,如果您正在寻找非常相似的图像(没有旋转,平移,较大的强度变化),那么算法就不是那么糟糕。对于整个图像来说,速度并不是那么快。而是用于在多个图像上查找相同的片段,或在较大的图像上查找较小的图像,而不是检查两个图像的相似性。 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html
对于整个图像,仅将图像相减然后使用模板匹配会更容易。它快得多。必须假设它们确实彼此相似。
直方图比较
您可以使用直方图比较。这是最快的方法,但并不准确。草和苹果都是绿色的,但彼此不同。谈到颜色,通常最好使用HSV颜色空间。 https://docs.opencv.org/3.4.1/d8/dc8/tutorial_histogram_comparison.html
功能匹配
算法正在搜索图像上的相似特征点。有很多算法可以找到图像上的特征。它们应该对比例变化和旋转等不敏感。但这取决于特征提取算法。 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_meaning/py_features_meaning.html#features-meaning
其他算法
其他算法是PSNR或SSIM。我从未使用过它,但是用于计算原始图像和模糊图像的相似度或整个视频序列的相似度。 https://docs.opencv.org/3.4.2/d5/dc4/tutorial_video_input_psnr_ssim.html
您也可以尝试比较图像的哈希值。 (对我来说)这是一种非常有趣的算法,但是没有充分记录。 https://www.pyimagesearch.com/2017/11/27/image-hashing-opencv-python/
功能匹配是此类任务最常用的算法。原因是特征匹配算法可以从不同角度,在不同条件下或仅部分重叠拍摄图像时检测到相似的图像片段。从运动构造算法通常使用特征匹配。 https://hub.packtpub.com/exploring-structure-motion-using-opencv/ 问题的解决方案始终取决于我们拥有的数据。所以没有答案。