gtc1986
初学者
初学者
  • 最后登录2016-05-31
  • 发帖数6
  • 金币55枚
  • 贡献勋章0枚
阅读:2590回复:5

请教HTuple数据类型与c++BYTE转换问题

楼主#
更多 发布于:2015-01-11 22:41


代码如下:
struct ImageInfo
{
 int Width;
 int Height;
 int BitsPerPixel;
 unsigned char* Buffer;
};
ImageInfo iDest;
HalconCpp::HTuple  hv_Pointer;
HalconCpp::HTuple  hv_Type, hv_Width, hv_Height;
HalconCpp::HTuple htChannels;HalconCpp::MeanImage(image,&image,1,1); //蹊跷的地方


HalconCpp::ConvertImageType(image, &image, "byte");
HalconCpp::CountChannels(image,&htChannels);
HalconCpp::GetImagePointer1(image,&hv_Pointer, &hv_Type, &hv_Width, &hv_Height);

iDest.Height = hv_Height.I();
iDest.Width = hv_Width.I();
iDest.BitsPerPixel = 8;
byteline = (iDest.Width + 3) / 4 * 4;

iDest.Buffer = (unsigned char*)malloc(byteline * iDest.Height*sizeof(unsigned char));
memset(iDest.Buffer, 0, byteline * iDest.Height * sizeof(unsigned char));

BYTE *pp = (BYTE*)hv_Pointer[0].L();
errno_t err = memcpy_s(iDest.Buffer, byteline * iDest.Height * sizeof(BYTE), pp, byteline * iDest.Height * sizeof(BYTE));
// Save iDest to bmp file
如果MeanImage算子mask大小为1,则保存图没有问题
如果MeanImage算子mask大小为11,则保存图如下:

最新喜欢:

ujs_ylujs_yl xingziyingxingzi...
gtc1986
初学者
初学者
  • 最后登录2016-05-31
  • 发帖数6
  • 金币55枚
  • 贡献勋章0枚
沙发#
发布于:2015-01-12 13:30
找到问题原因了:
1、我读取的bmp格式图像是需要4字节对齐的,而halcon里没有4字节对齐,所以需要再读取bmp文件后
重新分配一块内存(new BYTE[width * height]),width为实际的宽度,然后用这块内存去构造HObject实例,图像显示就不会有问题。
2、从HObject里返回图像内存指针时,也需要考虑halcon里没有4字节对齐这个问题。
因此,修改后的代码如下(以单通道灰度图像为例):
BYTE* pBmp;
BYTE* pImage;
ReadBmp("path",width,height,pBmp);
widthstep = (width + 3)/ 4*4;
pImage = new BYTE[width * height];
for(i=0; i<height; ++i)
{
     memcpy_s(pImage + i * width, width, pBmp + i * widthstep, width);
}
GenImage1Extern(&image,"byte",width,height,(Hlong)(pImage),NULL);
GetImagePointer1(image,&hv_Pointer, &hv_Type, &hv_Width, &hv_Height);
DestWidth = hv_Width.I();
DestHeight = hv_Height.I();
DestWidthStep = (DestWidth +3)/ 4*4;
BYTE *pDest = new[DestWidthStep * DestHeight]
BYTE *pointer = (BYTE*)hv_Pointer[0].L();
for(i=0; i<DestHeight; ++i)
{
      memcpy_s(pDest + i * DestWidthStep, DestWidth, pointer + i * DestWidth, DestWidth);
}
SaveBmp("",pDest);
gtc1986
初学者
初学者
  • 最后登录2016-05-31
  • 发帖数6
  • 金币55枚
  • 贡献勋章0枚
板凳#
发布于:2015-01-12 13:34
时间浪费在一开始没有去显示图像,只是单一的测试保存的图像。
mppstyle
助理工程师
助理工程师
  • 最后登录2017-05-22
  • 发帖数51
  • 金币346枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
地板#
发布于:2015-01-16 13:50
楼主,我想请问一下,你在数据转换操作iDest.Height = hv_Height.I();这个的时候运行起来没有问题吗?为什么我的程序一运行就提示内存有未经处理的异常呢?
gtc1986
初学者
初学者
  • 最后登录2016-05-31
  • 发帖数6
  • 金币55枚
  • 贡献勋章0枚
4楼#
发布于:2015-01-19 17:38
mppstyle:楼主,我想请问一下,你在数据转换操作iDest.Height = hv_Height.I();这个的时候运行起来没有问题吗?为什么我的程序一运行就提示内存有未经处理的异常呢?回到原帖
没有问题,我运行过的,我没有把全部代码贴出来,但是你说的这句应该没问题,或者你改成hv_Height[0].I(),应该是其他地方有问题
mppstyle
助理工程师
助理工程师
  • 最后登录2017-05-22
  • 发帖数51
  • 金币346枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
5楼#
发布于:2015-01-20 15:44
gtc1986:没有问题,我运行过的,我没有把全部代码贴出来,但是你说的这句应该没问题,或者你改成hv_Height[0].I(),应该是其他地方有问题回到原帖
多谢,我已经解决了,是我的变量类型定义的不对
游客

返回顶部