問題
夯劭猓康相機(jī)自己提供的/opt/MVS/Samples/64/Python/ConvertPixelType
代碼報錯,無法運行
截圖 2024-09-16 16-11-18.png
故障代碼
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)
分析
上述問題發(fā)生在數(shù)據(jù)格式轉(zhuǎn)換的過程中柠傍,針對這個問題麸俘,發(fā)現(xiàn)是函數(shù)MV_CC_ConvertPixelTypeEx
函數(shù)故障,結(jié)合狀態(tài)碼
截圖 2024-09-16 16-14-37.png
感覺是內(nèi)存方面出了問題惧笛。
查找一番从媚,發(fā)現(xiàn)了這個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))
# 內(nèi)存拷貝
pData = (c_ubyte * stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight)()
libc = CDLL('libc.so.6') #創(chuàng)建動態(tài)鏈接庫接口拜效,
libc.memcpy(byref(pData), stOutFrame.pBufAddr,stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight) #linux下復(fù)制函數(shù)的調(diào)用喷众,將結(jié)構(gòu)體stOutFrame中的圖像數(shù)據(jù)復(fù)制到'pdata'指向的內(nèi)存位置
# 數(shù)據(jù)解析與存儲
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)
總結(jié)
-
stOutFrame.pBufAddr
是一個動態(tài)內(nèi)存的指針,不停的有數(shù)據(jù)進(jìn)來紧憾,可能是導(dǎo)致問題的原因到千。 - 直接內(nèi)存塊拷貝,然后處理稻励,是不錯的方式父阻。