版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
如何使用VC在Halcon中得到像素的信息 Halcon的強(qiáng)大功能使我們省去很多圖像處理(機(jī)器視覺(jué))中的很多麻煩而又重復(fù)性的工作。但是,面向不同的應(yīng)用,應(yīng)該編寫自己最核心的算法,從而達(dá)到最佳的處理效果;而且Halcon并不可能把各種情況都考慮進(jìn)去。以下是我初步入門Halcon和VC的一點(diǎn)感觸和想法,已經(jīng)被實(shí)驗(yàn)證明了是正確的。1,在VC中,使用Halcon打開圖像文件,這里要注意read_image()和get_image_pointer1()指令被HDevelop翻譯過(guò)來(lái)以后如下:HobjectImageHTuplePointer,Type,Width,Heightget_image_pointer1(Image,&Pointer,&Type,&Width,&Height);VC中如下聲明:Halcon::HobjectImageHalcon::HTuplePointer,Type,Width,HeightVC中也可以如下聲明使用:HobjectImageCharlpcsType[MAX_STRING]HlongPointer,Width,Height或longWidth,Height(如果定義為HTuplePointer;HlongWidth,Height;編譯會(huì)出現(xiàn)錯(cuò)誤;使用Halcon::HTuplePointer,Type,Width,Height的話,后續(xù)中需要圖像的高寬時(shí),強(qiáng)制類型轉(zhuǎn)換不可用;當(dāng)然Hlong可以換成long,推薦使用Hlong。)get_image_pointer1(Image,&Pointer,lpcsType,&Width,&Height);這里注意,在VC中如果get_image_pointer1()中的字節(jié)類型使用tuple變量,那么Width和Height也必須使用tuple變量,否則編譯時(shí)候容易出錯(cuò)誤,至于原因是什么,可能halcon編譯的時(shí)候需要各個(gè)參數(shù)的類型形式一致。2,tuple類型的返回指針Pointer指向圖像數(shù)據(jù)區(qū)域(如果是彩色則指向色彩的第一通道),圖像的RGB色彩存放是同一種色彩信號(hào)最放在一起。注意Pointer所指向區(qū)域的大小比圖像必須的色彩信息要大許多,這里可能是因?yàn)楸仨殲閠uple變量定義一定的類型限制,從而使用的空間變大了(由于不了解tuple的內(nèi)部存儲(chǔ)格式,所以不敢斷定)。請(qǐng)看下面一段例子程序:使用Halcon,把彩色圖像轉(zhuǎn)化為灰度圖像,然后使用Pointer指針得到灰度圖像并顯示,包括在VC窗口中進(jìn)行顯示部分。usingnamespaceHalcon;charlpcsType[MAX_STRING];HlongPointerGray,WidthGray,HeightGray;rgb1_to_gray(objImage,&objImageGray);get_image_pointer1(objImage,&PointerGray,lpcsType,&WidthGray,&HeightGray);BYTE*lpByte;BYTE*ImageGray;intbytewidth;bytewidth=((long)WidthGray*3+3)/4*4;ImageGray=NULL;ImageGray=newBYTE[bytewidth*(long)HeightGray];lpByte=(BYTE*)PointerGray; //注意結(jié)合圖像像素存儲(chǔ)的類型進(jìn)行定義inti,j;for(j=(long)HeightGray-1;j>=0;j--){ //(注意tuple中圖像數(shù)據(jù)的存放和VC中的差別) for(i=0;i<(long)WidthGray;i++) { *(ImageGray+j*bytewidth+i*3+0)=*lpByte; *(ImageGray+j*bytewidth+i*3+1)=*lpByte; *(ImageGray+j*bytewidth+i*3+2)=*lpByte; lpByte++; }}BITMAPINFO*RotateBmpInfo;BYTE*bitBuffer;bitBuffer=NULL;bitBuffer=newBYTE[sizeof(BITMAPINFO)];RotateBmpInfo=(BITMAPINFO*)bitBuffer;RotateBmpInfo->bmiHeader.biSize =sizeof(BITMAPINFOHEADER);RotateBmpInfo->bmiHeader.biHeight =HeightGray;RotateBmpInfo->bmiHeader.biWidth =WidthGray;RotateBmpInfo->bmiHeader.biPlanes =1;RotateBmpInfo->bmiHeader.biBitCount =24;RotateBmpInfo->bmiHeader.biCompression =BI_RGB;RotateBmpInfo->bmiHeader.biSizeImage =HeightGray*bytewidth;RotateBmpInfo->bmiHeader.biXPelsPerMeter=0;RotateBmpInfo->bmiHeader.biYPelsPerMeter=0;RotateBmpInfo->bmiHeader.biClrUsed =0;RotateBmpInfo->bmiHeader.biClrImportant =0;CWnd*m_pWnd;m_pWnd=AfxGetApp()->GetMainWnd();CDC*ddc=m_pWnd->GetDC();::StretchDIBits( ddc->GetSafeHdc(), WidthGray+10, HeightGray+10, WidthGray, //顯示窗口寬度 HeightGray, //顯示窗口高度 0, 0, WidthGray, //圖像寬度 HeightGray, //圖像高度 ImageGray, RotateBmpInfo, DIB_RGB_COLORS, SRCCOPY);m_pWnd->ReleaseDC(ddc) ;delete[]ImageGray;delete[]bitBuffer;后來(lái)實(shí)驗(yàn)發(fā)現(xiàn),如果按照HDevelop默認(rèn)翻譯過(guò)來(lái)的規(guī)則寫C++程序,如下:Halcon::HobjectImageHalcon::HTuplePointer,Type,Width,Height操作get_image_pointer1(objImage,&Pointer,&Type,&Width,&Height)執(zhí)行以后,可以使用Width[0],Height[0]進(jìn)行數(shù)據(jù)訪問(wèn),但是命令:lpByte=(BYTE*)PointerGray; 不能夠執(zhí)行,作者也在進(jìn)一步弄清楚如何解決這個(gè)問(wèn)題,請(qǐng)大家給點(diǎn)幫助。今天在調(diào)試程序中發(fā)現(xiàn)一個(gè)問(wèn)題,再次讓我感受Halcon內(nèi)存管理的神秘,嘿嘿,說(shuō)說(shuō)問(wèn)題吧HlongPointerGray,PointerRed,PointerGreen,PointerBlue;HlongWidthGray,HeightGray;get_image_pointer1(objImageGray,&PointerGray,lpcsType,&WidthGray,&HeightGray);編譯可以通過(guò),但是HlongPointerGray,PointerRed,PointerGreen,PointerBlue;HlongWidthGray,HeightGray;get_image_pointer3(objImage,&PointerRed,&PointerGreen,&PointerBlue,&lpcsType,&WidthGray,&HeightGray);編譯就通不過(guò),大家可以試一下如果需要,可以使用decompose3(objImage,&objImageRed,&objImageGreen,&objImageGray);然后使用函數(shù)get_image_pointer1()得到指針我個(gè)人認(rèn)為是Halcon的變量類型講究統(tǒng)一,如果是Tuple都是Tuple,我個(gè)人認(rèn)為PointerRed,PointerGreen,PointerBlue可能是Tuple變量中的三個(gè)量,而HeightGray不是按照Tuple變量進(jìn)行管理的,純屬個(gè)人猜測(cè),大家有想法的給我回,或發(fā)郵件zhiyuanshiji@或者zhiyuan_maiker@1.從Halcon到VC++read_image(&Image,"文件名");//讀入的為灰度圖像//獲取圖像指針,注意輸出變量的類型charlpcsType[MAX_STRING];HlongPointer,Width,Height;get_image_pointer1(Image,&Pointer,lpcsType,&Width,&Height);//Halcon與VC++中的圖像之間,存在著上下翻轉(zhuǎn)BYTE*lpByte;BYTE*ImageG;intbytewidth;bytewidth=((long)Width*3+3)/4*4;ImageG=NULL;ImageG=newBYTE[bytewidth*(long)Height];lpByte=(BYTE*)Pointer;//注意結(jié)合圖像像素存儲(chǔ)的類型進(jìn)行定義inti,j;for(j=(long)Height-1;j>=0;j--){//(注意tuple中圖像數(shù)據(jù)的存放和VC中的差別)for(i=0;i<(long)WidthGray;i++){*(ImageG+j*bytewidth+i*3+0)=*lpByte;*(ImageG+j*bytewidth+i*3+1)=*lpByte;*(ImageG+j*bytewidth+i*3+2)=*lpByte;lpByte++;}}BITMAPINFO*RotateBmpInfo;BYTE*bitBuffer;bitBuffer=NULL;bitBuffer=newBYTE[sizeof(BITMAPINFO)];RotateBmpInfo=(BITMAPINFO*)bitBuffer;RotateBmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);RotateBmpInfo->bmiHeader.biHeight=Height;RotateBmpInfo->bmiHeader.biWidth=Width;RotateBmpInfo->bmiHeader.biPlanes=1;RotateBmpInfo->bmiHeader.biBitCount=24;RotateBmpInfo->bmiHeader.biCompression=BI_RGB;RotateBmpInfo->bmiHeader.biSizeImage=Height*bytewidth;RotateBmpInfo->bmiHeader.biXPelsPerMeter=0;RotateBmpInfo->bmiHeader.biYPelsPerMeter=0;RotateBmpInfo->bmiHeader.biClrUsed=0;RotateBmpInfo->bmiHeader.biClrImportant=0;CWnd*m_pWnd;m_pWnd=AfxGetApp()->GetMainWnd();CDC*pDC=m_pWnd->GetDC();::StretchDIBits(pDC->GetSafeHdc(),Width+10,Height+10,Width,//顯示窗口寬度Height,//顯示窗口高度0,0,Width,//圖像寬度Height,//圖像高度ImageG,RotateBmpInfo,DIB_RGB_COLORS,SRCCOPY);m_pWnd->ReleaseDC(pDC);delete[]ImageG;delete[]bitBuffer;2.從VC++到Halconunsignedchar*Pointer;intwidth,height;Pointer=newunsignedchar[width*height];inti,j;for(i=0;i<height;i++){for(j=0;j<width;j++){Pointer=j%255;}}HobjectImage;gen_image1_extern(&Image,"byte",(HTuple)width,(HTuple)height,(long)Pointer,NULL);注:a)gen_image1_extern函數(shù)中的變量width,height必須為HTuple類型,Pointer指針為unsignedchar類型,輸入時(shí)轉(zhuǎn)換為long型。b)width,height必須與Pointer指向的圖像數(shù)據(jù)的長(zhǎng)寬一致。c)Pointer指針在gen_image1_extern函數(shù)調(diào)用之前分配了內(nèi)存,之后不要馬上釋放,否則會(huì)出錯(cuò)。應(yīng)該在確保不再使用Image變量之后再釋放。halcon內(nèi)部會(huì)自動(dòng)釋放Image,感覺(jué)沒(méi)有釋放Pointer(還需要進(jìn)一步驗(yàn)證)。d)顯示圖像時(shí),可能存在著圖像的上下翻轉(zhuǎn),可以按照1中的方法,將圖像數(shù)據(jù)翻轉(zhuǎn)后再調(diào)用gen_image1_extern,或者使用halcon中的函數(shù)mirror_image()進(jìn)行翻轉(zhuǎn)。3.在VC界面中建立圖像窗口HlonglWWindowID;HTupleWindowHandle;lWWindowID=(Hlong)m_hWnd;//要顯示圖片的控件的句柄set_window_attr("border_widt
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作總結(jié)之房地產(chǎn)頂崗實(shí)習(xí)總結(jié)
- 工作總結(jié)之城市認(rèn)知實(shí)習(xí)總結(jié)
- 銀行內(nèi)部審計(jì)結(jié)果運(yùn)用制度
- 幼兒園元宵節(jié)做元宵活動(dòng)總結(jié)(32篇)
- 《讓測(cè)試敏捷起來(lái)》課件
- 內(nèi)衣銷售渠道研究報(bào)告(摘要fuheng)
- 黑龍江省虎林市2025屆高三六校第一次聯(lián)考數(shù)學(xué)試卷含解析
- 福建省廈門湖濱中學(xué)2025屆高三3月份第一次模擬考試數(shù)學(xué)試卷含解析
- 浙江省慈溪市2025屆高三第五次模擬考試英語(yǔ)試卷含解析
- 2025屆鹽城中學(xué)高三第五次模擬考試語(yǔ)文試卷含解析
- 2024年度上海浦東國(guó)際機(jī)場(chǎng)免稅店經(jīng)營(yíng)合同2篇
- 《紅樓夢(mèng)》十二講知到智慧樹期末考試答案題庫(kù)2024年秋安徽師范大學(xué)
- 《荷塘月色》課件25張-
- 新時(shí)代中國(guó)特色社會(huì)主義理論與實(shí)踐學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 尊重學(xué)術(shù)道德遵守學(xué)術(shù)規(guī)范學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024醫(yī)師定期考核臨床醫(yī)學(xué)試題
- 媒介與性別文化傳播智慧樹知到期末考試答案章節(jié)答案2024年浙江工業(yè)大學(xué)
- 小學(xué)勞動(dòng)知識(shí)試題及答案
- 消防救援-低溫雨雪冰凍惡劣天氣條件下災(zāi)害防范及救援行動(dòng)與安全
- 《CRRT操作方法》課件
- 河北省建筑工程技術(shù)資料管理規(guī)程(DB13(J)352002)
評(píng)論
0/150
提交評(píng)論