1. 程式人生 > >C# 使用Sentech相機sdk 獲取影象,轉換為halcon HImage的兩種方法

C# 使用Sentech相機sdk 獲取影象,轉換為halcon HImage的兩種方法

在網上搜索半天,沒有找到關於Sentech相機和halcon聯合程式設計的例子,先將自己的程式碼釋出如下.

sentech相機驅動和sdk 下載地址 


參考PvPipelineSample這個例子,自己修改後就可以連線相機.

SDK獲得影象型別是其自定義的 PvBuffer

                           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
</pre><p></p><p></p><pre code_snippet_id="1638895" snippet_file_name="blog_20160408_3_2876536" name="code" class="csharp">        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;
            }


        }

第二種方法是使用指標,

在網上看到一段程式碼,是如何獲取byte[]的指標

                           //byte[] outputData = new byte[2];
                           //void* p;
                           //IntPtr ptr;
                           //fixed (byte* pc = outputData)
                           //{
                           //    p = (void*)pc;
                           //    ptr = new IntPtr(p);
                           //}

查詢相機的api,知道

byte* pter = pvImage.DataPointer;

於是聯想到halcon的gen_image1最後一個引數也是需要指標

void HImage.GenImage1(string type, int width, int height, IntPtr pixelPointer)

於是便有了下面的程式碼

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

轉換成功了!!!哈哈~~

使用bitmap方法我的電腦耗時約為100ms,使用後面這種指標方法耗時約為5ms偷笑