小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

在VS2005中使用Halcon算子采集和處理圖像的步驟

 just4peterpan 2018-08-04
1.使用向?qū)?chuàng)建基于對(duì)話框的應(yīng)用程序。
2.環(huán)境變量設(shè)置,這步只要配置一次就可以。具體可以參加相關(guān)文章。
3.添加附加庫halconcpp.lib,project->properties->configuration properties->linker->Input->Additional dependecies后面添加。
4.添加頭文件和命名空間
在***Dlg.h頭文件中添加如下的頭文件和命名空間:
    #include "halconcpp.h"
    using namespace Halcon;
    
5.創(chuàng)建halcon顯示窗口
5.1定義窗口句柄(在***Dlg.h頭文件中添加):HTuple m_HWindowID
5.2添加初始化窗口函數(shù)(在***Dlg.h頭文件中添加):public:void InitHalconWindow();
5.3在對(duì)話框窗口添加一Picture控件,ID為:IDC_PIC_HWINDOW,用于顯示圖像。
5.4實(shí)例化初始化窗口函數(shù)(在***Dlg.cpp文件中添加),如下所示:
void C***Dlg::InitHalconWindow()
{
    //定義顯示的起點(diǎn)和長(zhǎng)寬高
    HTuple HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight;
    //定義窗口ID
    HTuple HWindowID;
    //定義一個(gè)CRect類的對(duì)象,用于獲取圖像框的尺寸和位置
    CRect Rect;
    CWnd *pWnd = GetDlgItem(IDC_PIC_HWINDOW);
    CDC *pDC = pWnd->GetDC();
    pWnd->GetWindowRect(&Rect);
    //設(shè)置顯示窗口的起點(diǎn)和寬高
    HWindowRow = 0;
    HWindowColumn = 0;
    HWindowWidth = Rect.Width();
    HWindowHeight = Rect.Height();
    //設(shè)定固定的窗口大小,而不是根據(jù)控件大小設(shè)定
    //GetDlgItem(IDC_PIC_HWINDOW)->SetWindowPos(NULL,0,0,322,242,SWP_NOZORDER | SWP_NOMOVE);
    try
    {
        set_window_attr("border_width",0);
        //獲取當(dāng)前窗口指針
        HWindowID = (Hlong)pWnd->m_hWnd;
        set_check("~father");
        open_window(HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight,HWindowID,"visible","",&m_HWindowID);
        set_check("father");
        //設(shè)置顯示模式是margin(邊緣)
        set_draw(m_HWindowID,"margin");
    }
    catch (HException& except)
    {
        TRACE(except.message);
    }
}
然后把此函數(shù)放到程序的初始化函數(shù)中(即放到OnInitDialog()函數(shù)中),之后程序運(yùn)行就可以打開窗口,窗口句柄為m_HWindowID。
 
6添加打開相機(jī)的函數(shù)
6.1定義相機(jī)句柄和圖像的寬高(在***Dlg.h頭文件中添加):HTuple m_FGHandle,m_ImageWidth, m_ImageHeight;
6.2定義打開相機(jī)函數(shù)(在***Dlg.h頭文件中添加):void OpenCam(CString strCamDrv);
6.3打開相機(jī)的函數(shù)實(shí)例化(在***Dlg.cpp文件中添加),如下所示:
void C***Dlg::OpenCam()
{
    try
    {
        //根據(jù)使用的相機(jī),選擇合適的參數(shù)
        open_framegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", "default", "USB 視頻設(shè)備", 0, -1, &m_FGHandle);
        //設(shè)置相機(jī)參數(shù)的一些算子
        //……
        
        //打開異步采集
        grab_image_start(m_FGHandle, -1);
        //采集一副圖像
        grab_image_async(&m_LiveImage, m_FGHandle, -1);
        //得到圖像的寬高和指針
        get_image_pointer1(m_LiveImage, NULL, NULL, &m_ImageWidth, &m_ImageHeight);
        //使圖像顯示適應(yīng)窗口大小
        set_part(m_HWindowID, 0, 0, m_ImageHeight - 1, m_ImageWidth -1);
    }
    catch (HException& except)
    {
        TRACE(except.message);
    }
}
然后把此函數(shù)放到程序的初始化函數(shù)中(即放到OnInitDialog()函數(shù)中),之后程序運(yùn)行就可以打開相機(jī),相機(jī)句柄為m_FGHandle。當(dāng)然也可以放到其他合適的地方。
 
7添加線程函數(shù),用于實(shí)時(shí)采集圖像和處理
7.1定義:添加線程布爾變量、線程句柄、事件和ID
    //是否采集布爾變量
    BOOL m_bStartSnap;
    
    //線程句柄和事件
    HANDLE m_hSnapHandle, m_hEvent;
    //線程ID
    DWORD m_dwThreadID;
    
    //定義采集到的圖像對(duì)象
    Hobject m_LiveImage;
    //定義線程函數(shù)
    Static DWORD CALLBACK SnapThread(LPVOID lpParam);
    
7.2添加線程體函數(shù)如下:    
DWORD WINAPI C***Dlg::SnapThread(LPVOID lpParam)
{
    CGrabberDlg *pDlg = (C***Dlg *)AfxGetApp()->m_pMainWnd;
    Hobject SymbolRegions;
    try
    {
        while (pDlg->m_bStartSnap)
        {
            //抓取圖像
            grab_image(&pDlg->m_LiveImage,pDlg->m_FGHandle);
            //窗口中顯示圖像
            disp_obj(pDlg->m_LiveImage, pDlg->m_HWindowID);    
            if (pDlg->m_bStartInc)
            {
                //處理采集的圖像
                {
                    pDlg->BarCodeInc(pDlg->m_LiveImage);
                }
            }
        }
            
    }
    catch (HException& except)
    {
        TRACE(except.message);
    }
    return 0;
}
7.3添加按鈕創(chuàng)建線程,在.2中描述了創(chuàng)建線程體函數(shù)的過程,這一段主要描述怎樣創(chuàng)建線程,上.2中的線程體函數(shù)開始運(yùn)行。
在OnInitDialog()初始化函數(shù)中初始化采集圖像的布爾變量,m_bStartSnap = FALSE;
在對(duì)畫框中添加一個(gè)按鈕,ID為:IDC_BUTTON_STARTSNAP,名稱為開始采集。為此按鈕添加事件如下:
void C***Dlg::OnBnClickedButtonStartsnap()
{
    // TODO: Add your control notification handler code here
    DWORD dwExit = 0;
    MSG msg;
    if (!m_bStartSnap)
    {
        //采集圖像的布爾變量為TRUE
        m_bStartSnap = TRUE;
        m_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
        //創(chuàng)建線程
        m_hSnapHandle=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)SnapThread, m_hEvent, 0, &m_dwThreadID);
        SetEvent(m_hEvent);
    }
    else
    {
        m_bStartSnap = FALSE;
        do
        {
            Sleep(1);
            GetExitCodeThread(m_hSnapHandle, &dwExit);
            if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
            }
        }while(dwExit == STILL_ACTIVE);
        //關(guān)閉線程和事件
        CloseHandle(m_hEvent);
        CloseHandle(m_hSnapHandle);
    }
}
完成以上七步以后,運(yùn)行程序,點(diǎn)擊開始采集按鈕,如果連接上相機(jī)的話此時(shí)在窗口中會(huì)實(shí)時(shí)顯示采集到的圖像。
 
8添加煙盒一維條碼識(shí)別程序。
把編寫好的Hdev程序?qū)С鯟PP文件,從cpp文件中找出我們需要部分,添加到程序中。
8.1定義條碼識(shí)別的各種變量,包括條碼句柄、條碼類型和識(shí)別的條碼結(jié)果。
    HTuple m_BarCodeHandle, m_CodeTypes, m_DecodedDataStrings;
    
8.2在OnInitDialog()初始化函數(shù)中創(chuàng)建條碼句柄和設(shè)置條碼類型,如下所示:
    create_bar_code_model(HTuple(), HTuple(), &m_BarCodeHandle);
    m_CodeTypes = "auto";
    
8.3添加條碼識(shí)別函數(shù)
定義://條碼識(shí)別函數(shù)
void BarCodeInc(Hobject Image);
實(shí)例化該函數(shù)的代碼如下:
void C***Dlg::BarCodeInc(Hobject Image)
{
    Hobject SymbolRegions;
    try
    {
        //在圖像中找到條碼并進(jìn)行識(shí)別
        //find_bar_code(Image, &SymbolRegions, m_BarCodeHandle, m_CodeTypes, &m_DecodedDataStrings);
        //設(shè)置條碼的顯示位置
        //set_tposition(m_HWindowID2, 24, 12);
        //在窗口的相應(yīng)位置顯示是別的條碼數(shù)據(jù)
        //write_string(m_HWindowID, "條碼:"+m_DecodedDataStrings);
        //用于測(cè)試
        threshold(Image,&SymbolRegions,0,125);
        disp_obj(SymbolRegions,m_HWindowID);
    }
    catch (HException& except)
    {
        TRACE(except.message);
    }
}
 
8.4在對(duì)話框界面中添加一個(gè)按鈕控件,ID為: IDC_BUTTON_STARTINC,名稱為:開始檢測(cè)
雙擊此按鈕控件添加一個(gè)消息響應(yīng)函數(shù):void C***Dlg::OnBnClickedButtonStartinc()
定義:在***Dlg.h中添加一個(gè)是否開始檢測(cè)的布爾變量:BOOL m_bStartInc,并在OnInitDialog()初始化函數(shù)中把布爾變量設(shè)置為: bStartInc = FALSE;
在OnBnClickedButtonStartinc()函數(shù)中添加如下內(nèi)容:
void CGrabberDlg::OnBnClickedButtonStartinc()
{
    // TODO: Add your control notification handler code here
    if (!m_bStartInc)
    {
        m_bStartInc = TRUE;
    }
    else
    {
        m_bStartInc = FALSE;
    }
}
 
8.5在SnapThread(LPVOID lpParam)函數(shù)中添加如下內(nèi)容:
    if (pDlg->m_bStartInc)
    {
        //處理采集的圖像
        {
            pDlg->BarCodeInc(pDlg->m_LiveImage);
        }
    }nbsp;//定義窗口ID

&//定義一個(gè)CRect類的對(duì)象,用于獲取圖像框的尺寸和位置
&
&*pWnd = GetDlgItem(IDC_PIC_HWINDOW);
&*pDC = pWnd-&GetDC();

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多