Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在opencv中模拟短路和短路_Python_C++_Opencv_Bitwise And - Fatal编程技术网

Python 如何在opencv中模拟短路和短路

Python 如何在opencv中模拟短路和短路,python,c++,opencv,bitwise-and,Python,C++,Opencv,Bitwise And,我试图检查二进制图像(模板)是否包含在另一个图像(源)中。为此,我首先做了如下工作: (这是一个类似python的伪代码,但我对正确的技术比对语言实现更感兴趣) 然后我意识到我可以通过避免计数非零来加快速度: mask = bitwise_and(template, source) mask_against_template = bitwise_xor(template, mask) is_contained = not mask_against_template.any() 此代码比第一个代

我试图检查二进制图像(模板)是否包含在另一个图像(源)中。为此,我首先做了如下工作:

(这是一个类似python的伪代码,但我对正确的技术比对语言实现更感兴趣)

然后我意识到我可以通过避免计数非零来加快速度:

mask = bitwise_and(template, source)
mask_against_template = bitwise_xor(template, mask)
is_contained = not mask_against_template.any()
此代码比第一个代码快近3倍。我现在想知道opencv中是否存在短路和运算符,如果按位_返回true,对于所有白色像素都是true,或者在找到第一个false操作时返回false。这样,我就不必使用xor,甚至不必以位和的方式运行整个图像

有什么想法吗

编辑:

我忘了提到我甚至试过这段代码,但是使用xor比使用==:要快一点

mask = bitwise_and(template, source)
mask_against_template = template == mask
is_contained = mask_against_template.all()

我最终找到了解决办法。我用python实现了短路和操作,结果比cv2.bitwise_慢很多,后面是一个cv2.bitwise_异或。但后来我用numba预编译了这个函数,最终得到了一个运行速度是cv2的4倍的函数。代码如下:

@numba.jit("b1(u1[:,:],u1[:,:])")
def is_template_in(template, image):
    for y in range(0, template.shape[0]):
        for x in range(0, template.shape[1]):
            if template[y][x] and not image[y][x]:
                return False
    return True

我最终找到了解决办法。我用python实现了短路和操作,结果比cv2.bitwise_慢很多,后面是一个cv2.bitwise_异或。但后来我用numba预编译了这个函数,最终得到了一个运行速度是cv2的4倍的函数。代码如下:

@numba.jit("b1(u1[:,:],u1[:,:])")
def is_template_in(template, image):
    for y in range(0, template.shape[0]):
        for x in range(0, template.shape[1]):
            if template[y][x] and not image[y][x]:
                return False
    return True

据我所知,OpenCV没有类似的功能,但是可以将std::find_if与cv::Mat迭代器和一个谓词一起使用,当满足条件时(在本例中,像素不是白色)返回true。它将在第一个真值处停止,并且只检查图像一次。如果全部为白色,它将返回迭代器end,您可以在它完成后对其进行比较。据我所知,OpenCV没有类似的功能,但您可以将std::find_If与cv::Mat迭代器一起使用,并在满足条件时返回true的谓词(在本例中,像素不是白色)。它将在第一个真值处停止,并且只检查图像一次。如果全部为白色,它将返回迭代器end,您可以在迭代器完成后进行比较。