halcon、opencv和C++图像内存数据处理机制有差异,在进行相互转换的时候需要注意内存数据排列问题,否则可能出现花图或者多出黑边等现象。
Halcon自身处理不需要考虑字节对齐,但opencv和C++需要考虑,相互转换的时候均需要考虑字节对齐问题。 Halcon的图像内存机制是紧密排列,而opencv和C++图像内存数据是四字节对齐排列。只有当图像宽度为4的整数倍时,halcon、opencv和C++的图像内存是一致的,可相互直接转换,否则必须调整内存排列后转换。
下列是不确定是否图像宽度是四的整数倍的时候,三种图像数据的相互转换代码例程。
1)假设图像大小为nWid*nHei;图像数据PBYTE m_ptr;
m_ptr = new BYTE[WIDTHBYTES(nWid*8)*nHei];
转opencv:cvImg
IPlImage cvImg;
cvImg = cvCreateImage(CvSize(nWid,nHei), IPL_DEPTH_8U, 1);
for(int j=0; j<nWid; j++)
for(int i=0; i<nHei; i++)
{
cvImg->imageData[ntmp] = m_ptr[ntmp];
}
(其中:nModeWid = WIDTHBYTES(nWid8);
ntmp = inModeWid+j)
转Halcon:
hImg PBYTE pbDstImg; Hobject hImg;
pbDstImg = new BYTE[nWidnHei];
for(int j=0; j<nWid; j++)
for(int i=0; i<nHei; i++)
{
pbDstImg [ntmp1] = m_ptr[ntmp];
}
Hlong hWid,hHei;
hWid = nWid; hHei = nHei;
gen_image1_extern(&hImg, “byte”, hWid, hHei, (Hlong)pbDstImg,NULL);
(其中:ntmp = inModeWid+j, ntmp1 = inWid+j)
2)假设Halcon图像大小为modelWid*modelHei,图像hImg;
unsigned char ptr;
get_image_pointer1(hImg,
(Hlong)&ptr, type, &modelWid, &modelHei);
转C++:
m_pImgMode; PBYTE m_pImgMode;
m_pImgMode = new BYTE[WIDTHBYTES(modelWid 8)modelHei]
for(int i=0; i<modelHei; i++)
memcpy(pImgMode+iWIDTHBYTES(modelWid
8), ptr+imodelWid, modelWid);
转OpenCV:
cvImage; IPlImage cvImage =
(CvSize(modelWid, modelHei), IPL_DEPTH_8U, 1);
for(int i=0; i<modelHei; i++)
memcpy(cvImage>imageData+iWIDTHBYTES(modelWid8),ptr+i*modelWid, modelWid);