1. 如何在VB,VC和.NET中使用halcon
HALCON對於機器視覺的學習者、開發者而言並不陌生,稱其為機器視覺領域第一軟體,亦無可厚非。
HALCON對於視覺系統的控制、圖像的處理和分析都能夠較好的實現,尤其是各種圖像處理演算法。但就其本身而言,開發用戶界面並不理想。用戶界面以及對於其他底層的控制,比如和底層電路板、PLC等的控制和通信,可通過VC++、VB等進行開發。方便的是,HALCON恰恰能夠被這些開發工具所調用,它支持C、C++、VB、java等等。
剛開始結合VC++結合HALCON進行學習和開發時,因為軟體方面的薄弱,對如何在VC++中如何調用HALCON感到不知所措,也在網上找了一些資料,資料較少,基本內容相同,或許能用,但始終對於筆者個人而言不太靈光。後來在一位軟體同事的指導下,對其有了較為深刻的了解,其實說到底對軟體工程師而言這是一件很簡單的事,也就是將HALCON的庫導入VC++。
以下,針對初學者一步步介紹,以MFC作為開發工具。
在Visual Studio中新建項目選擇Visual C++下的MFC,其中的MFC應用程序,建立過程不贅述。本文以Visual Studio 2005為例。
打開HALCON安裝目錄(以HALCON7.0為例,後面的版本也相同),如下圖1所示:
將其中的include文件夾整個拷貝至所建MFC項目工作目錄下,如下圖2所示:
同樣,將HALCON的LIB文件拷貝到所建MFC項目工作目錄下,因使用C++進行開發,所以選擇X:Program FilesMVTecHALCONlibi586-nt4下的halconcpp.lib,這里X:為安裝盤符
打開stdafx.h,在文件中空白位置處,加入
#include "include/cpp/HalconCpp.h"
#prama comment(lib,"halconcpp.lib")
下一步,點擊項目下的屬性,如下圖6所示:
點開配置屬性中的C/C++,如下圖7所示:
當點在附加包含目錄右側空白框時,會出現的圖標,點開,如下圖8所示:
點擊新建行,將所建MFC項目工程目錄下的include文件夾的地址輸入,也就是剛才我們拷貝過去的那個文件夾
最後一步,在需要使用HALCON庫的地方,將其頭文件導入,以****Dlg.cpp為例
這樣我們就算成功在VC++/MFC中導入了HALCON庫文件,就可以調用HALCON的函數,使用其強大的演算法。另外,單純執行上述步驟後,按F5啟動調試,應該是不會有任何的ERROR和WARNING的。此方法同樣適用於VB,在此不贅述,VB的開發者可自行嘗試。
2. 如何在vc++中調用halcon的hdev檔案
vc使用halcon
使用hdevelop導出halcon程序的c++代碼之後,比如
[cpp] view plainread_image (image, 'C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp')
rgb1_to_gray (image, GrayImage)
dev_set_color('blue')
*bin_threshold (GrayImage, Region)
threshold(GrayImage,Region,100,255)
area_center (Region, Area, Row, Column)
生成c++代碼
[cpp] view plain///////////////////////////////////////////////////////////////////////////////
// File generated by HDevelop for HALCON/C++ Version 10.0
///////////////////////////////////////////////////////////////////////////////
#include "HalconCpp.h"
using namespace Halcon;
#ifndef NO_EXPORT_MAIN
// Main procere
void action()
{
using namespace Halcon;
// Local iconic variables
Hobject image, GrayImage, Region;
// Local control variables
HTuple Area, Row, Column;
read_image(&image, "C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
rgb1_to_gray(image, &GrayImage);
if (HDevWindowStack::IsOpen())
set_color(HDevWindowStack::GetActive(),"blue");
bin_threshold(GrayImage, &Region);
area_center(Region, &Area, &Row, &Column);
}
#ifndef NO_EXPORT_APP_MAIN
int main(int argc, char *argv[])
{
using namespace Halcon;
// Default settings used in HDevelop (can be omitted)
set_system("do_low_error","false");
action();
return 0;
}
#endif
#endif
新建一個對話框mfc程序(vc2008),添加一個按鈕button1,加入如下代碼(我將action函數稍微改了一下)
當然先要#include "HalconCpp.h"
[cpp] view plain// Main procere
double action( char * p)
{
using namespace Halcon;
// Local iconic variables
Hobject image, GrayImage, Region;
// Local control variables
HTuple Area, Row, Column;
read_image(&image, p);
rgb1_to_gray(image, &GrayImage);
if (HDevWindowStack::IsOpen())
set_color(HDevWindowStack::GetActive(),"blue");
//bin_threshold(GrayImage, &Region);
threshold(GrayImage, &Region,50,255);
area_center(Region, &Area, &Row, &Column);
double d=Area[0];
return d;
}
void CabcDlg::OnBnClickedButton1()
{
// TODO: 在此添加控制項通知處理程序代碼
double d=action("C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
CString str;
str.Format("%f",d);
AfxMessageBox(str);
}
編譯程序之前需要先設置一下include和鏈接環境,對於vc2008
工具/選項/項目解決方案/vc++目錄/包含文件/ 添加
C:\Program Files\MVTec\HALCON-10.0\include
C:\Program Files\MVTec\HALCON-10.0\include\cpp
工具/選項/項目解決方案/vc++目錄/庫文件/ 添加
C:\Program Files\MVTec\HALCON-10.0\lib\x86sse2-win32
然後執行即可。
3. vc halcon 定義沖突怎麼辦
用VC創建工程 1.首先在project->settings.....中的Link屬性頁中添加halconcpp.lib; 2. 其次在project->settings.....中的C/C++屬性頁中的Preprocessor中添加目(HALCONROOT)\include,(HALCONROOT)\include\cpp; 然後加入頭文件#include "HalconCpp.h" 最後加入語句#pragma comment(lib,"halconcpp.lib") 就可以使用halcon的庫了
4. halcon程序可運行於安卓嗎
halcon程序可運行於安卓。halcon是德國MVtec公司開發的一套完善的機器視覺演算法包,擁有靈活的機器視覺集成開發環境,用戶可快速完成圖像處理與分析的開發工作。在歐洲以及日本工業界公認halcon軟體是最佳機器視覺軟體。halcon軟體有一千多個獨立的函數,其中包含了各類濾波、幾何轉換、形態學計算分析等。
halcon程序功能
halcon軟體支持Windows、Linux和MacOSX操作環境,整個函數庫可以用C、C+C#等,Visualbasic和Delphi等多種編程語言調用。halcon軟體為百餘種工業相機和圖像採集卡提供了介面。HALCON軟體提供了一套互動式程序開發工具HDevelop,可在其中以halcon程序代碼直接編寫、修改、執行程序,並且可以查看計算過程中的所有變數。
5. 機器視覺怎樣開始學halcon與c++還是c#搭配好
java和C的運行效率對比:C的運行效率明顯要比JAVA高,因為C是編譯型的,直接將源碼編譯成機器代碼;而JAVA是解釋型,源碼被編譯成二進制偽代碼,由JAVA虛擬機解釋執行。但是,由於C是編譯型的,它的可移植性差;而JAVA是解釋執行,因此具有很好的移植性,可跨平台運行。編一個普通的本地應用程序,一般c 要快於java, 編web應用,由於c實現的cgi程序基本是進程型,而java application server 的管理servlet採用線程方式,所以,在訪問量大的情況下,java有優勢。
6. HALCON機器視覺軟體的HALCON簡介
它節約了產品成本,縮短了軟體開發周期——HALCON靈活的架構便於機器視覺,醫學圖像和圖像分析應用的快速開發。在歐洲以及日本的工業界已經是公認具有最佳效能的Machine Vision軟體。
HALCON源自學術界,它有別於市面一般的商用軟體包。事實上,這是一套image processing library,由一千多個各自獨立的函數,以及底層的數據管理核心構成。其中包含了各類濾波,色彩以及幾何,數學轉換,形態學計算分析,校正,分類辨識,形狀搜尋等等基本的幾何以及影像計算功能,由於這些功能大多並非針對特定工作設計的,因此只要用得到圖像處理的地方,就可以用HALCON強大的計算 分析能力來完成工作。應用范圍幾乎沒有限制,涵蓋醫學,遙感探測,監控,到工業上的各類自動化檢測。
HALCON支持Windows,Linux和Mac OS X操作環境,它保證了投資的有效性。整個函數庫可以用C,C++,C#,Visual basic和Delphi等多種普通編程語言訪問。HALCON為大量的圖像獲取設備提供介面,保證了硬體的獨立性。它為百餘種工業相機和圖像採集卡提供介面,包括GenlCam,GigE和IIDC 1394。
7. halcon配置mfc報錯函數找不到標識符
任務:將參數保存到配置文件和從配置文件讀取參數項。
一開始,我想通過halcon中的open_file,等運算元來文件的保存和讀取,雖然沒有報錯,但是保存的文件不知在哪,估計沒有保存成功。查資料過程中,了解到可以用配置文件實現這功能。
第一步,編輯資源中的菜單項,添加兩個菜單,本例子中使用「設置」和「讀取」兩菜單項。
第二步,添加菜單事件響應。
第三步,修改設置菜單項響應函數如下:
void CHalconMFCDlg::OnSetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
CFileDialog dlg(FALSE, ".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini|All files|*.*||"));//OFN_ALLOWMULTISELECT打開多文檔選項。
if (dlg.DoModal()==IDOK) //如果返回為確定,獲得選擇的文件名
{
//獲取完整文件名
pathname = dlg.GetPathName( ); //
char PathBuff[256];
//GetCurrentDirectory(256,PathBuff); // 獲取當前路徑。
//pathname.Format("%s\%s",PathBuff,Filename);
strSection = "顯示區域";
strSectionKey = "左上角行坐標 ";
//strValue = "";
strValue.Format("%d",m_Row1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "左上角列坐標 ";
//strValue = "";
strValue.Format("%d",m_Col1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角行坐標 ";
//strValue = "";
strValue.Format("%d",m_Row2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角列坐標 ";
//strValue = "";
strValue.Format("%d",m_Col2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSection = "分割方法";
strSectionKey = "分割方法 ";
//strValue = "";
m_ComboSelectMethod.GetWindowTextA(PathBuff,256);
strValue.Format("%s",PathBuff);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
MessageBox("設置已保存");
}
}
第四步,修改讀取菜單項響應函數如下:
void CHalconMFCDlg::OnGetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
char strBuff[256];
CFileDialog dlg(TRUE,".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini||"));//OFN_ALLOWMULTISELECT打開多文檔選項。
if (dlg.DoModal()==IDOK) //如果返回為確定,獲得選擇的文件名
{
//讀取完整文件名,包括路徑和後綴
Filename = dlg.GetPathName( );
//讀取ini文件中的字元串
strSection = "分割方法";
strSectionKey = "分割方法 ";
GetPrivateProfileString( strSection, strSectionKey,NULL, strBuff,80, Filename);
strValue.Format("%s",strBuff);
//讀取ini文件中的數字
strSection = "顯示區域";
strSectionKey = "左上角行坐標 ";
m_Row1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "左上角列坐標 ";
m_Col1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角行坐標 ";
m_Row2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角列坐標 ";
m_Col2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
//更新相應數據
m_ComboSelectMethod.SetWindowTextA(strValue);
UpdateData(FALSE);
}
}
在前面的基礎上,添加這些代碼就可以實現配置文件的讀寫。這里簡單的介紹配置文件讀寫涉及到的幾個函數。
//一、向ini文件中寫入信息的函數
//1. 把信息寫入系統的win.ini文件
BOOL WriteProfileString(
LPCTSTR lpAppName, // 節的名字,是一個以0結束的字元串
LPCTSTR lpKeyName, // 鍵的名字,是一個以0結束的字元串。若為NULL,則刪除整個節
LPCTSTR lpString // 鍵的值,是一個以0結束的字元串。若為NULL,則刪除對應的鍵
)
//2. 把信息寫入自己定義的.ini文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
LPCTSTR lpString, // 同上
LPCTSTR lpFileName // 要寫入的文件的文件名。若該ini文件與程序在同一個目錄下,
// 也可使用相對路徑,否則需要給出絕度路徑。
)
//若在win.ini中創建一個Test節,並在該節中創建一個鍵id,其值為xym,則可以這樣寫:
WriteProfileString("Test", "id", "xym");
//若在Ex1目錄下的ex1.ini中創建一個Test節,並在該節中創建一個鍵id,其值為xym
WritePrivateProfileString("Test", "id", "xym", "d:\vc\Ex1\ex1.ini");
//若Ex1.ini文件與讀寫該文件的程序在同一個目錄下,則上面語句也可寫為:
WritePrivateProfileString("Test", "id", "xym", ".\ex1.ini");
需要注意的是,C系列的語言中,轉義字元「\」表示反斜線「」。另外,當使用相對路徑時,「\」前的「.」號不能丟掉了。
//二、從ini文件中讀取數據的函數
//1、從系統的win.ini文件中讀取信息
//(1) 讀取字元串
DWORD GetProfileString(
LPCTSTR lpAppName, // 節名
LPCTSTR lpKeyName, // 鍵名,讀取該鍵的值
LPCTSTR lpDefault, // 若指定的鍵不存在,該值作為讀取的默認值
LPTSTR lpReturnedString,// 一個指向緩沖區的指針,接收讀取的字元串
DWORD nSize // 指定lpReturnedString指向的緩沖區的大小
)
//如:
CString str;
GetProfileString("Test", "id", "Error", str.GetBuffer(20),20);
//(2) 讀取整數
UINT GetProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault // 若指定的鍵名不存在,該值作為讀取的默認值
)
//如使用以下語句寫入了年齡信息:
WriteProfileString("Test", "age", "25");
// 在win.ini中創建一個Test節,並在該節中創建一個鍵age,其值為25。
//則可用以下語句讀取age鍵的值:
int age;
age = GetProfileInt("Test", "age", 0);
//2、從自己的ini文件中讀取信息
//(1) 讀取字元串
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 同1(1)
LPCTSTR lpKeyName, // 同1(1)
LPCTSTR lpDefault, // 同1(1)
LPTSTR lpReturnedString,// 同1(1)
DWORD nSize, // 同1(1)
LPCTSTR lpFileName // 讀取信息的文件名。若該ini文件與程序在同一個目錄下,
// 也可使用相對路徑,否則需要給出絕度路徑。
)
//如:
CString str;
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,".\ex1.ini");
//或:
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,"d:\vc\Ex1\ex1.ini");
//(2) 讀取整數
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault, // 若指定的鍵名不存在,該值作為讀取的默認值
LPCTSTR lpFileName // 同上
)
//如使用以下語句寫入了年齡信息:
WritePrivateProfileString("Test","age","25",".\ex1.ini");
//在ex1.ini中創建一個Test節,並在該節中創建一個鍵age,其值為25。
//則可用以下語句讀取age鍵的值:
int age;
age = GetPrivateProfileInt("Test","age",0,".\ex1.ini");
8. 專家們,小弟剛接觸機器視覺系統,請問,HALCON輸出的C代碼能用於DSP晶元嗎
應該不行,用OPENCV應該可以
9. 如何用C++調用halcon函數
下面是一個用C++調用halcon函數的實例,說明://後面的部分為程序的說明,在程序運行中是不起作用的。
a) gen_image1_extern函數中的變數width,height必須為HTuple類型,Pointer指針為unsigned char類型,輸入時轉換為long型。
b) width, height必須與Pointer指向的圖像數據的長寬一致。
c) Pointer指針在gen_image1_extern函數調用之前分配了內存,之後不要馬上釋放,否則會出錯。應該在確保不再使用Image變數之後再釋放。halcon內部會自動釋放Image,感覺沒有釋放Pointer(還需要進一步驗證)。
d) 顯示圖像時,可能存在著圖像的上下翻轉,可以按照1中的方法,將圖像數據翻轉後再調用gen_image1_extern,或者使用halcon中的函數mirror_image()進行翻轉。
BITMAPINFO * RotateBmpInfo;
BYTE * bitBuffer;
bitBuffer = NULL;
bitBuffer = new BYTE[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,
從VC++到Halcon
unsigned char *Pointer;
int width, height;
Pointer = new unsigned char[width * height];
int i, j;
for (i=0; i<height; i++)
{
for (j=0; j<width; j++)
{
Pointer[i*width+j] = j % 255;
}
}
Hobject Image;
gen_image1_extern(&Image, "byte", (HTuple)width, (HTuple)height, (long)Pointer, NULL);
10. 哪裡有c#與halcon聯合編程實例
你如果安裝了Halcon的話,裡面會附有程序員文檔,說明了在各種編程語言如何操作Halocn提供的函數或者使用導出的類,並且在Example中提供有關具體應用的例子。常用的方法是先在Halocn提供的集成開發環境中做實驗,然後導出成某種編程語言,再應用...