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