opencv 将动画单元格与相应的帧匹配(使用模板/特征匹配?)

gc0ot86w  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(135)

我有一张来自Kiki's Delivery Service的cel(一张经过扫描的彩色塑料片层,用于创建旧动画电影的框架)的图像,如下所示:

我希望能够将其与电影《Kiki's Delivery Service》中的精确(或足够接近)匹配帧进行匹配:

为了清楚起见,我有一个文件夹,其中包含来自电影的约12,000帧,涵盖了完整的运行时间,因此任务是迭代这些帧,以通过算法找到与cel“最相似”的帧。

我想要的

  • 将单元格与其对应的影片帧精确匹配
  • 这可能意味着:12,000个帧中的每一个的分数(在0和1之间,包括0和1),其中1意味着与单元格完全匹配,0意味着与单元格绝对不匹配,对于实际的对应帧,分数最大化。
    问题
  • 做这件事的最佳方法是什么?
    意见
  • 模板匹配似乎是次优的,因为它似乎假设在一个大得多的图像中找到一个小的子图像
  • 我知道“图像金字塔”可以用来建立一组越来越小的图像,但这在时间和计算方面似乎很昂贵
  • 要素匹配可能是一种更好的方法,因为它似乎独立于缩放和旋转而工作
    我所尝试的
  • 删除单元格中的空白背景。这是因为空白是无关紧要的,我不希望它影响任何算法(即算法只尝试匹配具有大量白色背景的图像)
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

cel = cv.imread('./cels/kikis_delivery_service/1.jpg', 1)
cel_grey = cv.cvtColor(cel, cv.COLOR_BGR2GRAY)

ret, mask = cv.threshold(cel_grey, 220, 255, cv.THRESH_BINARY_INV)
b, g, r = cv.split(cel)
rgba = [b, g, r, mask]
dst = cv.merge(rgba, 4)
cv.imwrite('test.png', dst)

  • 模板匹配,但结果不好(使用cv.TM_CCOEFF_NORMED,得分〈0.3)

任何帮助和建议,在这方面将不胜感激。

tv6aics1

tv6aics11#

不知道这是不是你要找的,但是一张图片的mse或者均方误差可以给予你一个衡量两张图片的“接近程度”的标准,然后你可以通过这些图片来找到最接近你想要的图片,但是这可能需要一些时间。

import os
import cv2
import numpy as np

def mse(img1, img2):
   h, w = img1.shape
   diff = cv2.subtract(img1, img2)
   err = np.sum(diff**2)
   mse = err/(float(h*w))
   return mse

images = [f"path/to/folder{file}" for file in os.listdir("path/to/folder")]

img1 = cv2.imread("image_of_cel.png")
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

image_errors = []

for image in images:
    img2 = cv2.imread(image)
    img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

    image_errors.append((image, mse(img1, img2)))

这段代码不是我的,是从这里取的,不会给予0 -〉1的错误范围

相关问题