Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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
C++ OpenCV Python通过图像数据绑定极其缓慢的迭代_C++_Python_Opencv_Performance - Fatal编程技术网

C++ OpenCV Python通过图像数据绑定极其缓慢的迭代

C++ OpenCV Python通过图像数据绑定极其缓慢的迭代,c++,python,opencv,performance,C++,Python,Opencv,Performance,我最近在OpenCV c++中获取了一些基于颜色跟踪对象的代码,并在python绑定中重写了它 总体结果和方法明显相同。但是,当我在视频的每一帧上执行下面的代码时,它需要差不多2-3秒的时间来完成,因为C++变体,也在下面,是比较即时的,而且我可以在帧之间迭代,就像我的手指可以按一个键一样快。 有什么想法或意见吗 cv.PyrDown(img, dsimg) for i in range( 0, dsimg.height ): for j in range( 0,

我最近在OpenCV c++中获取了一些基于颜色跟踪对象的代码,并在python绑定中重写了它

总体结果和方法明显相同。但是,当我在视频的每一帧上执行下面的代码时,它需要差不多2-3秒的时间来完成,因为C++变体,也在下面,是比较即时的,而且我可以在帧之间迭代,就像我的手指可以按一个键一样快。 有什么想法或意见吗

    cv.PyrDown(img, dsimg)
    for i in range( 0, dsimg.height ):
        for j in range( 0, dsimg.width):

            if dsimg[i,j][1] > ( _RED_DIFF + dsimg[i,j][2] ) and dsimg[i,j][1] > ( _BLU_DIFF + dsimg[i,j][0] ):
                res[i,j] = 255
            else:
                res[i,j] = 0

for(int i=0;i<(高度);i++)
{
对于(int j=0;j<(宽度);j++)
{
如果((数据[i*步进+j*通道+1])>(红色_差异+数据[i*步进+j*通道+2]))&&
((数据[i*步进+j*通道+1])>(BLU DIFF+数据[i*步进+j*通道])
数据\u r[i*步进\u r+j*通道\u r]=255;
其他的
数据\u r[i*步进\u r+j*通道\u r]=0;
}
}

谢谢

尝试使用numpy来进行计算,而不是嵌套循环。对于numpy提供的这种简单计算,您应该可以获得类似C的性能

例如,嵌套的For循环可以替换为几个numpy表达式

我对opencv不太熟悉,但我认为python绑定现在有了一个numpy数组接口,因此上面的示例应该非常简单:

cv.PyrDown(img, dsimg)

data = np.asarray(dsimg)
blue, green, red = data.T

res = (green > (_RED_DIFF + red)) & (green > (_BLU_DIFF + blue))
res = res.astype(np.uint8) * 255

res = cv.fromarray(res)
(当然,完全未经测试…)再说一遍,我对opencv真的不是很熟悉,但不管怎样,嵌套式python for循环并不是修改图像元素的方式


无论如何,希望这有点帮助

这无疑加快了速度,但我似乎无法理解为什么结果与我的图像阈值更密切相关,并且它没有找到图像上的绿色区域,因为它看起来应该是这样的?我可能误解了图像的红色、绿色和蓝色通道的顺序。。。(从上面的代码来看,似乎蓝色是第一个通道,红色是最后一个…)也许可以尝试将“数据”数组解包为
红色、绿色、蓝色=数据。T
?只是胡乱猜测。。。我可能完全错了……是的,这是我最初的想法,但改变顺序不会产生不同的结果。_RED_DIFF和_BLU是高值,155,因此图像中不应该有很多白色像素,但仍然有;当我把(u DIFF)设为255时,几乎全是白色的?我似乎无法理解res=(绿色>(红色+红色))和(绿色>(蓝色+蓝色))的结果。嗯。。。这可能是一个溢出问题。。。在numpy中,若您处理的是uint8,那个么它们会像在C中一样溢出。若您将155添加到uint8,很有可能很多值会溢出到较低的值。也许可以试着从uint16开始
data=np.asarray(dsimg,dtype=np.uint16)
?我必须说非常聪明。这就成功了。谢谢你的帮助,非常感谢。
cv.PyrDown(img, dsimg)

data = np.asarray(dsimg)
blue, green, red = data.T

res = (green > (_RED_DIFF + red)) & (green > (_BLU_DIFF + blue))
res = res.astype(np.uint8) * 255

res = cv.fromarray(res)