Opencv cv2.absdiff(img1, img2).sum() 没有临时img

Posted

技术标签:

【中文标题】Opencv cv2.absdiff(img1, img2).sum() 没有临时img【英文标题】:Opencv cv2.absdiff(img1, img2).sum() without temporary img 【发布时间】:2013-07-23 15:19:37 【问题描述】:

是否可以在没有临时 img 的情况下计算 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 标准 L1 0.000226647018223 4315120.0

【问题讨论】:

【参考方案1】:

尝试norm 函数与NORM_L1 规范。 C++代码:

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

【讨论】:

不错,我测试过并且比 absdiff 方法更快。我希望能找到比这更快的东西

以上是关于Opencv cv2.absdiff(img1, img2).sum() 没有临时img的主要内容,如果未能解决你的问题,请参考以下文章

Opencv python背景减法和运动跟踪

OpenCV版本4.1.0 drawContours

OpenCV 图像特效

opencv学习之路Mat类介绍,基本绘图函数

python opencv:像素运算

尝试将图像与 openCV 混合