日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用相机SDK采相转换至HImage

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用相机SDK采相转换至HImage 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源于http://blog.sina.com.cn/s/blog_d40acd530102xndm.html

Halcon采相功能非常強大,基本支持各大品牌以及各個通信接口的相機,并且Halcon提供為相機廠商提供了制作Halcon相機接口庫的辦法,總之Halcon基本可以直接連接所有工業相機。

但是Halcon連接相機采相存在兩個問題:一是相機參數可調整范圍有限,不如相機的SDK提供的可調參數多;二是相機SDK提供了采相回調函數,采相實時性更好(Halcon下也可回調,沒研究過)。因此大部分機器視覺工程師仍然采用相機SDK采相。

使用相機SDK采相,必然面臨的問題就是如何將圖像在內存中直接轉換為HImage格式。今天我們將學習如何將內存中的圖像轉化為HImage。

首先,簡單介紹三個算子;然后,縱向比較三個算子不同點;最后,舉例說明算子的用法。

gen_image1( : Image : Type, Width, Height, PixelPointer : )

從像素指針創建圖像,即得到像素的內存指針(PixelPointer),已知圖像的類型(Type)、尺寸(Width、Height)就可將其轉化為HImage。

gen_image3(: ImageRGB : Type, Width, Height, PixelPointerRed, PixelPointerGreen, PixelPointerBlue : )

?從像素指針創建圖像,即得到像素的RGB三通道內存指針(PixelPointerRed、PixelPointerGreen、PixelPointerBlue),已知圖像的類型(Type)、尺寸(Width、Height)就可將其轉化為HImage。

gen_image_interleaved( : ImageRGB : PixelPointer, ColorFormat, OriginalWidth, OriginalHeight, Alignment, Type, ImageWidth, ImageHeight, StartRow,StartColumn, BitsPerChannel, BitShift : )

?從像素指針創建圖像,即得到像素的內存指針(PixelPointer),已知圖像的類型(ColorFormat)、尺寸(ImageWidth、ImageHeight)就可將其轉化為HImage。

gen_image1適合于單通道圖像轉化,gen_image3轉化需要分別知道RGB三個通道的指針,gen_image_interleaved轉化需要知道圖像的內存的總指針以及圖像的格式。

因此gen_image1適合單通道灰度圖轉化,gen_image3適合RGB三通道內存分別存放的相機轉化,gen_image_interleaved基本適合所有格式的轉化,操作簡單且可以進行ROI操作,因為大部分相機采相為1個總指針,所以gen_image_interleaved適用范圍非常廣,所以我們首先結合Halcon的例子來展示一下這個算子的魅力。

*1.讀取圖像

read_image (Image, 'lena')

*2.將圖像分離為三通道后合并得到圖像總指針(這一步是一個外部函數,大家不必關心,因為相機SDK基本可以直接拿到這個指針)

rgb3_to_interleaved (Image,ImageInterleaved)

get_image_pointer1?(ImageInterleaved,Pointer, TypeRGB, Width, Height)

dev_close_window ()

dev_open_window (0, 0, Width / 3, Height,'black', WindowHandle)

dev_set_part (0, 0, Height, Width / 3)

*3圖像由內存中轉化為HImage

gen_image_interleaved (BImageRGB1, Pointer,'rgb', Width / 3, Height, -1, 'byte', 0, 0, 0, 0, -1, 0)

stop ()

*4圖像由內存中轉化為HImage,并進行ROI

gen_image_interleaved (BImageRGB2, Pointer,'rgb', Width / 3, Height, -1, 'byte', Width / 6, Height / 2, Height / 3, Width/ 12, -1, 0)

stop ()

*5圖像格式有RGB定義為BGR,展示這個功能主要是想提醒小伙伴,如果轉化火來顏色不對,可能是由于格式選擇錯誤

gen_image_interleaved (BImageBGR1, Pointer,'bgr', Width / 3, Height, -1, 'byte', 0, 0, 0, 0, -1, 0)

接下來我們將結合度申相機SDK來展示如何從將圖像由內存轉化至HImage

首先我們來看度申相機SDK的采相回調函數如下:

??public ?int _dvpStreamCallback (uint handle, dvpStreamEvent _event, IntPtr pContext, refdvpFrame refFrame, IntPtr pBuffer)

handle——相機句柄

refFrame——幀信息

pBuffer——數據內存指針

那么數據內存指針就有了,接著我們查看幀信息中有什么,打開類定義如下

????publicstructdvpFrame

???????{

????????[Description("是否水平翻轉")]

????????publicbyte bFlipHorizontalState;

????????[Description("是否垂直翻轉")]

????????publicbyte bFlipVerticalState;

????????[Description("位寬")]

????????publicdvpBits bits;

????????[Description("是否逆時針旋轉")]

????????publicbyte bRotateOpposite;

????????[Description("是否旋轉90度")]

????????publicbyte bRotateState;

????????[Description("模擬增益")]

????????publicfloat fAGain;

????????[Description("曝光時間(微秒)")]

????????publicdouble fExposure;

????????[Description("格式")]

????????publicdvpImageFormat format;

????????[Description("高度")]

????????publicint iHeight;

????????[Description("寬度")]

????????publicint iWidth;

????????[Description("第一個像素點的位置")]

????????publicdvpFirstPosition position;

????????[Description("保留字節")]

????????publicuint[] reserved;

????????[Description("字節數")]

????????publicuint uBytes;

????????[Description("幀編號")]

????????publiculong uFrameID;

????????[Description("時間戳")]

????????publiculong uTimestamp;

???????}

gen_image_interleaved(: ImageRGB : PixelPointer, ColorFormat, OriginalWidth, OriginalHeight, Alignment, Type, ImageWidth, ImageHeight, StartRow,StartColumn, BitsPerChannel, BitShift : )

從幀信息中可以得到圖像格式、位數、圖像寬度、圖像高度,于是gen_image_interleaved的必備參數全部得到。

寫到C#格式下

public ?int _dvpStreamCallback0(uint handle, dvpStreamEvent _event, IntPtr pContext, refdvpFrame refFrame, IntPtr pBuffer)

????{ ?????????

?????if (ho_Img != null)

???????{

?????????ho_Img.Dispose();//釋放HIamge資源

???????}

?????else

??????{

???????HOperatorSet.GenEmptyObj(out ho_Img);//初始化HImage

??????}

?????if ((long)pBuffer != 0)

?????{

??????HOperatorSet.GenImageInterleaved(out ho_Img, pBuffer, "bgr", refFrame.iWidth, refFrame.iHeight, -1, "byte", refFrame.iWidth,refFrame.iHeight, 0, 0, -1, 0);//格式轉換

??????}

??????GC.GetTotalMemory(true);//需要實時將圖像的內存回收掉,防止占用過多CPU資源控制系統垃圾回收器,專制內存不足 ???

}

?

參考這個相機SDK采相轉HImage的例子,各位小伙伴應該學會如何使用相機SDK再Halcon中采相了吧。

總結

以上是生活随笔為你收集整理的利用相机SDK采相转换至HImage的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。