为什么OpenCV的SetData实际上没有设置图像数据?

时间:2017-11-08 12:13:50

标签: python python-2.7 opencv raspberry-pi3

我有一个程序使用OpenCV 2在图像中进行标记检测(用C语言编写,带有Python 2 ctypes包装器),我正在尝试将Raspberry Pi相机的输出转换为该代码。

基本上,我有一个2D numpy数组image,其中包含灰色图像数据(来自cv2.imdecode);然后,我执行此操作以获得空IplImage

ipl_image = cv2.cv.CreateImageHeader((image.shape[1], image.shape[0]), cv2.cv.IPL_DEPTH_8U, 1)

然后将实际图像数据分配给IplImage,如下所示:

cv2.cv.SetData(ipl_image, image.tobytes(), image.dtype.itemsize * image.shape[1])

如果我然后调用图像分析函数(find_markers_fp),我得到一个段错误 - 通过大量的printf调试,我发现IplImage->imageData是0,当它应该是指向尽管我打电话给SetData,但仍然是图像数据。这会导致C程序尝试进​​行空指针取消引用,因此会出现段错误。

不知何故,我发现在调用ipl_image.tostring()之前调用find_markers_fp会使其正常工作,但OpenCV 2.4 documentation中的任何地方都没有记录此函数,仅在{{3}中}}。我没有对函数的结果做任何事情,我只是调用它,并且C程序开始返回有效的结果而不是segfaulting。

为什么调用此函数会使IplImage可用,或者更重要的是,如何避免使用此未记录的函数?

0 个答案:

没有答案