Opencv cv2.absdiff(img1, img2).sum() 无需临时图像

8

是否可以在不使用临时图像的情况下计算cv2.absdiff(img1, img2).sum()?

我有一个视频流,需要在处理开始时进行某种形式的图像稳定。absdiff能够快速地检查两个连续图像的不同摆放向量,并给出一个误差依赖的结果,但是我必须创建、写入和读取一个仅用于计算img.sum()的临时图像。因此,消除这些内存分配、写入和读取步骤将是很好的。

def calcMatch(img1, img2):
    diff = cv2.absdiff(img1, img2)
    return diff.sum()

Python解决方案

import cv2
import time

img = cv2.imread('test.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img1 = img[10:330, 10:870]
img2 = img[20:340, 20:880]

start = time.clock()
d = cv2.absdiff(img1, img2)
s = d.sum()
t = time.clock() - start
print 'with absdiff ', t
print s

start = time.clock()
s = cv2.norm(img1, img2, cv2.NORM_L1)
t = time.clock() - start
print 'with norm L1 ',  t
print s

在我的笔记本电脑上,使用以下方式可以显著提高速度,并且比例非常稳定:
使用absdiff 0.00207574457822
4315120
使用norm L1 0.000226647018223
4315120.0

1个回答

6

尝试使用带有 NORM_L1norm 函数。C++ 代码:

double res = cv::norm(img1, img2, cv::NORM_L1);

还不错,我测试了一下,比absdiff方法快。希望能找到更快的方法。 - ati ince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接