问题
海康相机自己提供的/opt/MVS/Samples/64/Python/ConvertPixelType
代码报错,无法运行
故障代码
nRGBSize = stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight * 1
stConvertParam = MV_CC_PIXEL_CONVERT_PARAM_EX()
memset(byref(stConvertParam), 0, sizeof(stConvertParam))
stConvertParam.nWidth = stOutFrame.stFrameInfo.nWidth
stConvertParam.nHeight = stOutFrame.stFrameInfo.nHeight
stConvertParam.pSrcData = stOutFrame.pBufAddr
stConvertParam.nSrcDataLen = stOutFrame.stFrameInfo.nFrameLen
stConvertParam.enSrcPixelType = stOutFrame.stFrameInfo.enPixelType
stConvertParam.enDstPixelType = PixelType_Gvsp_Mono8 #PixelType_Gvsp_RGB8_Packed
stConvertParam.pDstBuffer = (c_ubyte * nRGBSize)()
stConvertParam.nDstBufferSize = nRGBSize
ret = cam.MV_CC_ConvertPixelTypeEx(stConvertParam)
分析
上述问题发生在数据格式转换的过程中,针对这个问题,发现是函数MV_CC_ConvertPixelTypeEx
函数故障,结合状态码
感觉是内存方面出了问题。
查找一番,发现了这个https://blog.csdn.net/qq_44621315/article/details/141139882,感觉可以用来试试。
解决办法
print ("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (stOutFrame.stFrameInfo.nWidth, stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nFrameNum))
# 内存拷贝
pData = (c_ubyte * stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight)()
libc = CDLL('libc.so.6') #创建动态链接库接口,
libc.memcpy(byref(pData), stOutFrame.pBufAddr,stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight) #linux下复制函数的调用,将结构体stOutFrame中的图像数据复制到'pdata'指向的内存位置
# 数据解析与存储
data = np.frombuffer(pData, count=int(stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight), dtype=np.uint8)
data = data.reshape(stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nWidth, -1)
print(data.shape, data.dtype)
cv2.imwrite("xxx.bmp", data)
总结
-
stOutFrame.pBufAddr
是一个动态内存的指针,不停的有数据进来,可能是导致问题的原因。 - 直接内存块拷贝,然后处理,是不错的方式。