Halcon、opencv与C++的图像数据转换

	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(nWid
8);
ntmp = inModeWid+j)
转Halcon:
hImg PBYTE pbDstImg; Hobject hImg;
pbDstImg = new BYTE[nWid
nHei];
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+i
WIDTHBYTES(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+i
WIDTHBYTES(modelWid
8),ptr+i*modelWid, modelWid);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HalconOpenCV都是图像处理领域的常用工具,但它们的API和功能有所不同。因此,如果你想要实现Halcon的卡尺工具,需要使用Halcon的API进行编程。 以下是使用Halcon实现卡尺工具的示例代码: ```cpp #include <iostream> #include "HalconCpp.h" using namespace HalconCpp; using namespace std; int main() { try { HImage image("test.jpg"); HTuple hv_Width, hv_Height; GetImageSize(image, &hv_Width, &hv_Height); OpenWindow(0, 0, hv_Width, hv_Height, 0, "visible", "", &hv_WindowHandle); HRegion region; Threshold(image, &region, 128, 255); HRegion regionOpening; OpeningCircle(region, &regionOpening, 5.0); HRegion regionClosing; ClosingCircle(regionOpening, &regionClosing, 5.0); HXLDCont xldCont; GenContourRegionXld(regionClosing, &xldCont, "border"); HTuple hv_Row1, hv_Column1, hv_Row2, hv_Column2, hv_Length1, hv_Length2; MeasureContourLength(xldCont, 1, 0, 0, &hv_Row1, &hv_Column1, &hv_Row2, &hv_Column2, &hv_Length1); MeasureContourLength(xldCont, 1, 0, 1, &hv_Row1, &hv_Column1, &hv_Row2, &hv_Column2, &hv_Length2); cout << "Length1: " << hv_Length1.D() << endl; cout << "Length2: " << hv_Length2.D() << endl; ClearWindow(hv_WindowHandle); DispObj(image, hv_WindowHandle); DispObj(xldCont, hv_WindowHandle); Sleep(10000); CloseWindow(hv_WindowHandle); } catch (HException &except) { cout << except.ErrorMessage() << endl; } return 0; } ``` 在这段代码中,我们首先使用Halcon加载图像,然后进行阈值化、开闭运算等操作得到目标区域。接着,我们使用GenContourRegionXld函数将目标区域转换为XLD轮廓,然后使用MeasureContourLength函数测量轮廓的长度。最后,我们将结果显示在图像上,并等待10秒钟后关闭窗口。 需要注意的是,这只是一个简单的示例代码,实际应用中可能需要进行更多的参数设置和异常处理。另外,如果你想要使用OpenCV实现类似的功能,也可以参考OpenCV的线段检测算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值