sc6231565
管理员
管理员
  • 最后登录2020-05-27
  • 发帖数1008
  • 金币17535枚
  • 贡献勋章0枚
  • 社区明星
  • 最爱沙发
  • 原创写手
  • 喜欢达人
  • 忠实会员
  • 社区居民
阅读:15389回复:46

C#使用Sentech相机sdk 获取图像,转换为halcon HImage的两种方法

楼主#
更多 发布于:2016-04-08 12:24
在网上搜索半天,没有找到关于Sentech相机和halcon联合编程的例子,先将自己的代码发布如下.


sentech相机驱动和sdk 下载地址

图片:QQ截图20160408114632.png




参考PvPipelineSample这个例子,自己修改后就可以连接相机.


SDK获得图像类型是其自定义的 PvBuffer

                           //转换成HImage
                          PvImage  pvImage =  lBuffer.Image;
                          Int32 width = (Int32)pvImage.Width;
                          Int32 height = (Int32)pvImage.Height;
                          Bitmap bitMap = new Bitmap(width, height);
                          pvImage.CopyToBitmap(bitMap);
                     
                          HObject hObject = HImageConvertFromBitmap32(bitMap);



将其转换成为Bitmap类型,再转换成为HImage



        private static HObject HImageConvertFromBitmap32(Bitmap bmp)
        {
            HObject ho_Image;
            HOperatorSet.GenEmptyObj(out ho_Image);
            unsafe
            {
                System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
                unsafe
                {
                    HOperatorSet.GenImageInterleaved(out ho_Image, bmpData.Scan0, "bgrx", bmp.Width, bmp.Height, -1, "byte", bmp.Width, bmp.Height, 0, 0, -1, 0);
                }
                return ho_Image;
            }




        }


第二种方法是使用c# 指针,网上只看到过c++使用指针转换成为图像,在这里使用C#也可以.
在网上看到一段代码,是如何获取byte[]的指针

20170304更新

vb.net测试的时候,发现bmp内存没有释放,需要手动释放
更新vb.net方法

    Private Shared Function HImageConvertFromBitmap32(bmp As Bitmap) As HObject         TimeTool.startTime("转换HObject")
        Dim ho_Image As HObject = New HObject()
        Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(New System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.[ReadOnly], System.Drawing.Imaging.PixelFormat.Format32bppRgb)
        HOperatorSet.GenImageInterleaved(ho_Image, bmpData.Scan0, "bgrx", bmp.Width, bmp.Height, -1, _
            "byte", bmp.Width, bmp.Height, 0, 0, -1, _
            0)
        '释放位图         bmp.UnlockBits(bmpData)
        TimeTool.stopTime("转换HObject")
        Return ho_Image
 
 
    End Function


  1. //byte[] outputData = new byte[2];  
  2. //void* p;  
  3. //IntPtr ptr;  
  4. //fixed (byte* pc = outputData)  
  5. //{  
  6. //    p = (void*)pc;  
  7. //    ptr = new IntPtr(p);  
  8. //}  


查询相机的api,知道

byte* pter = pvImage.DataPointer;
于是联想到halcon的gen_image1最后一个参数也是需要指针
void HImage.GenImage1(string type, int width, int height, IntPtr pixelPointer)
于是便有了下面的代码




  1. HImage hObject1 = new HImage();  
  2. byte* pter = pvImage.DataPointer;  
  3. hObject1.GenImage1("byte", width, height, new IntPtr(pter));  


转换成功了!!!哈哈~~

使用bitmap方法我的电脑耗时约为100ms,使用后面这种指针方法耗时约为5ms





http://blog.csdn.net/sc6231565/article/details/51095229


附件是自己简单做的例子
就是用sdk获取图像,转换为HImage,然后显示在halcon的空间上

图片:QQ截图20160408120240.png

附件名称/大小 下载次数 最后更新
sentechConection.zip (924KB)  182 2016-04-08 12:00 售价5金币[记录]
喜欢25

最新打赏:0人

chentian1207
技术员
技术员
  • 最后登录2020-05-21
  • 发帖数379
  • 金币374枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
沙发#
发布于:2016-04-08 19:59
楼主我曾经也为这个问题烦恼,就是如何把相机sdk内存中的图像变量实时的转成HImage格式的图像进行处理。我想知道楼主你试过了,你这种方法转换成功了吗?
ii
sc6231565
管理员
管理员
  • 最后登录2020-05-27
  • 发帖数1008
  • 金币17535枚
  • 贡献勋章0枚
  • 社区明星
  • 最爱沙发
  • 原创写手
  • 喜欢达人
  • 忠实会员
  • 社区居民
板凳#
发布于:2016-04-08 21:10
chentian1207:楼主我曾经也为这个问题烦恼,就是如何把相机sdk内存中的图像变量实时的转成HImage格式的图像进行处理。我想知道楼主你试过了,你这种方法转换成功了吗?回到原帖
是的,已经成功了,500W相机拍的图片大小约为5mb,使用bitmap转换时间需要100ms,而使用指针转换为5ms
[sc6231565于2016-04-09 09:40编辑了帖子]
chentian1207
技术员
技术员
  • 最后登录2020-05-21
  • 发帖数379
  • 金币374枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
地板#
发布于:2016-04-09 19:49
sc6231565:是的,已经成功了,500W相机拍的图片大小约为5mb,使用bitmap转换时间需要100ms,而使用指针转换为5ms回到原帖
那太好了,我也试试,感谢楼主啊
ii
chentian1207
技术员
技术员
  • 最后登录2020-05-21
  • 发帖数379
  • 金币374枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
4楼#
发布于:2016-04-09 19:51
楼主还有个问题就是能不能有法子,把HImage数据格式转成bitmap的方法啊
ii
sc6231565
管理员
管理员
  • 最后登录2020-05-27
  • 发帖数1008
  • 金币17535枚
  • 贡献勋章0枚
  • 社区明星
  • 最爱沙发
  • 原创写手
  • 喜欢达人
  • 忠实会员
  • 社区居民
5楼#
发布于:2016-04-09 21:26
chentian1207:楼主还有个问题就是能不能有法子,把HImage数据格式转成bitmap的方法啊回到原帖
不知道了.没试过
chentian1207
技术员
技术员
  • 最后登录2020-05-21
  • 发帖数379
  • 金币374枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
6楼#
发布于:2016-05-18 15:11
private static HObject HImageConvertFromBitmap32(Bitmap bmp)
        {
            HObject ho_Image;
            HOperatorSet.GenEmptyObj(out ho_Image);
            unsafe
            {
                System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
                unsafe
                {
                    HOperatorSet.GenImageInterleaved(out ho_Image, bmpData.Scan0, "bgrx", bmp.Width, bmp.Height, -1, "byte", bmp.Width, bmp.Height, 0, 0, -1, 0);
                }
                return ho_Image;
            }


想请教一下大神,这个转换为什么只能对单幅图片有效,就是加载一幅图像时是可以转换并且在halcon窗口显示。但是对于实时拍取的图像转换无效啊,无法在halcon自带的显示控件上实时显示图像啊,求大神指教
ii
sc6231565
管理员
管理员
  • 最后登录2020-05-27
  • 发帖数1008
  • 金币17535枚
  • 贡献勋章0枚
  • 社区明星
  • 最爱沙发
  • 原创写手
  • 喜欢达人
  • 忠实会员
  • 社区居民
7楼#
发布于:2016-05-18 15:38
chentian1207:private static HObject HImageConvertFromBitmap32(Bitmap bmp)
        {
            HObject ho_Image;
            HOpe...
回到原帖
我没有测试过实时显示,你可以试试用第二种指针的方法,应该是可以的
chentian1207
技术员
技术员
  • 最后登录2020-05-21
  • 发帖数379
  • 金币374枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
8楼#
发布于:2016-05-18 15:47
sc6231565:我没有测试过实时显示,你可以试试用第二种指针的方法,应该是可以的回到原帖
哦哦,你也是用单幅图像测试的是吧,不知道是不是因为转换时间太长的原因导致跟不上实时拍取图像的速度所以导致无法显示转换的结果。第二种方法的确好,但是SDK里面数据指针没有啊,找不到
ii
sc6231565
管理员
管理员
  • 最后登录2020-05-27
  • 发帖数1008
  • 金币17535枚
  • 贡献勋章0枚
  • 社区明星
  • 最爱沙发
  • 原创写手
  • 喜欢达人
  • 忠实会员
  • 社区居民
9楼#
发布于:2016-05-18 16:53
chentian1207:哦哦,你也是用单幅图像测试的是吧,不知道是不是因为转换时间太长的原因导致跟不上实时拍取图像的速度所以导致无法显示转换的结果。第二种方法的确好,但是SDK里面数据指针没有啊,找不到回到原帖
byte* pter = pvImage.DataPointer;
这种方式获取数据指针
sc6231565
管理员
管理员
  • 最后登录2020-05-27
  • 发帖数1008
  • 金币17535枚
  • 贡献勋章0枚
  • 社区明星
  • 最爱沙发
  • 原创写手
  • 喜欢达人
  • 忠实会员
  • 社区居民
10楼#
发布于:2016-05-18 16:55
chentian1207:哦哦,你也是用单幅图像测试的是吧,不知道是不是因为转换时间太长的原因导致跟不上实时拍取图像的速度所以导致无法显示转换的结果。第二种方法的确好,但是SDK里面数据指针没有啊,找不到回到原帖
我想起来了,我的程序是可以在实时显示的,两种方法都可以实时显示,你会不会是其他地方出错,比如是异步采集?
chentian1207
技术员
技术员
  • 最后登录2020-05-21
  • 发帖数379
  • 金币374枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
11楼#
发布于:2016-05-19 16:26
sc6231565:我想起来了,我的程序是可以在实时显示的,两种方法都可以实时显示,你会不会是其他地方出错,比如是异步采集?回到原帖
可以把完整程序示例打包发我看看吗,大神。非常感谢,邮箱850413931@qq.com
ii
18126252779
技术员
技术员
  • 最后登录2017-06-12
  • 发帖数46
  • 金币150枚
  • 贡献勋章0枚
12楼#
发布于:2016-08-11 13:55
谢谢楼主分享。。。。。。。。
xuweidongkobe
工程师
工程师
  • 最后登录2019-09-24
  • 发帖数152
  • 金币666枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
13楼#
发布于:2016-08-18 12:14
楼主,basler相机的你有代码吗
benjiang
初学者
初学者
  • 最后登录2019-03-24
  • 发帖数22
  • 金币14枚
  • 贡献勋章0枚
  • 社区居民
14楼#
发布于:2016-08-20 15:42
新手学习,谢谢分享VVV。
上一页
游客

返回顶部
支付

欢迎打赏,请选择打赏金额

  • 1元
  • 6元
  • 10元
  • 66元
  • 100元

支付即代表同意《本站支付协议》 有疑问请联系客服