求和numpy.ndarray公司传递到线程时失败

2024-09-28 23:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Python脚本,它通过对ctypes的调用与一个帧捕获器接口。它从帧捕获器获取一个图像作为指向字节数组的指针。然后我想沿着其中一个维度对数组求和以绘制一个轮廓。当我在同一个线程中执行此操作时,效果很好。但是我想切换到另一个线程进行处理(这样我就可以尽可能快地抓取图像)。当我这么做的时候numpy.sum数方法似乎在内部悄无声息地溢出,因为我得到的配置文件中有负数。知道这里会发生什么吗?下面是一个代码片段:

self.grablib.IC_SnapImage(self.hGrabber, 100) # 100 ms timeout
imgPtr = self.grablib.IC_GetImagePtr(self.hGrabber)
#imgPtr is returned as a char pointer, which will mess things up
imgPtr2 = ctypes.cast(imgPtr, ctypes.POINTER(ctypes.c_byte))
imgArray = np.ctypeslib.as_array(imgPtr2, (572, 768))
imgTime = datetime.now()
args = (imgArray, imgTime)
Thread(target=self.processImage, args=args).start()

下面是处理线程中的错误代码:

# Another thread to actually do the processing, while the previous one gets another image
def processImage(self, imgArray, imgTime):
    iy = np.sum(imgArray[range(0, 572, 2)], 1, dtype=np.float)

我在sum中把什么作为dtype参数似乎并不重要,溢出仍然发生。这就好像numpy的累加器默认为错误的类型,并且没有被dtype参数推翻。你知道吗


Tags: 图像selfnumpynpargs数组ctypes线程
1条回答
网友
1楼 · 发布于 2024-09-28 23:15:46

正如我在评论中提到的,错误是将char指针转换为POINTER(ctypes.c_byte)。显然c_byte是有符号的,这就是产生混淆的原因。基本上我的剧本是把负数加起来。对不起,努比,这次不是你的错!有问题的一行应该是:

imgPtr2 = ctypes.cast(imgPtr, ctypes.POINTER(ctypes.c_uint8))

显然uint8是一个无符号8位整数,这正是我想要的。我不知道为什么我不把它放在开头。(另外,我也不知道为什么它只能在不同的线程中工作——这很奇怪。)

相关问题 更多 >