MFC/HALCON混合編程系列一_相機打開圖像_簡單處理_


1.說明
        通過相機打開一幅圖像,然后處理此圖像並顯示最終結果。使用的Hdevelop的代碼如下:
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
 
從Hdevelop導出的C++代碼如下:
///////////////////////////////////////////////////////////////////////////////
// File generated by HDevelop for HALCON/C++ Version 8.0
///////////////////////////////////////////////////////////////////////////////
#include"HalconCpp.h"
#ifndefNO_EXPORT_MAIN
// Main procedure
voidaction()
{
usingnamespaceHalcon;
// Local iconic variables
Hobject Image, Region, ConnectedRegions, SelectedRegions;
Hobject RegionClosing, RegionDifference, ConnectedRegions1;
Hobject SelectedRegions1;
// Local control variables
HTuple AcqHandle, Pointer, Type, Width, Height;
HTuple WindowHandle;
//dev_close_window ()
//dev_update_window ('off')
//close_all_framegrabbers ()

open_framegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default",
"", "default", -1, -1, &AcqHandle);
grab_image(&Image, AcqHandle);
get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
set_window_attr("background_color","black");
open_window(0,140,Width/2,Height/2,0,"","",&WindowHandle);
disp_obj(Image, WindowHandle);

set_color(WindowHandle,"red");
threshold(Image, &Region, 0, 50);
connection(Region, &ConnectedRegions);
select_shape(ConnectedRegions, &SelectedRegions, "rect2_len1", "and", 500, 550);
closing_rectangle1(SelectedRegions, &RegionClosing, 80, 80);
difference(RegionClosing, SelectedRegions, &RegionDifference);
connection(RegionDifference, &ConnectedRegions1);
select_shape(ConnectedRegions1, &SelectedRegions1, "area", "and", 500, 99999);
clear_window(WindowHandle);
disp_obj(Image, WindowHandle);
disp_obj(SelectedRegions1, WindowHandle);
//grab_image (Image, AcqHandle)
}
#ifndefNO_EXPORT_APP_MAIN
intmain(intargc, char*argv[])
{
usingnamespaceHalcon;
// Default settings used in HDevelop (can be omitted)
set_system("do_low_error","false");
action();
return0;
}
#endif
#endif
 
我們當前要做的就是將這些導出的C++代碼嵌入到MFC工程中。
 
2.新建MFC對話框工程。點擊VS2005 菜單file/new/project,彈出如下對話框:
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
 
在Visual C++下選擇MFC,然后選擇右邊的MFC Application,輸入工程的名字HalconMFC,點擊確定將彈出應用程序向導。
 
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
 
在Application Type中選中Dialog Based。Resource language根據你自己愛好選擇,我這里選擇中文(中國)。點擊下一步。
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
        到User Interface Features,勾選Minimize box 和 Maximize Box,那么生成的對話框就可以最小化和最大化。點擊next,后面幾個選擇默認的就好,直到finish。這樣一個新的對話框工程就OK了。
 
3.設置工程
        為了能夠使用halcon提供的圖像處理算子,1.需要設置工程的屬性。點擊project/properties/Configuration Properties/Linker/Input,在Additional Dependencies 中添加 halconcpp.lib ,如下圖所示:
在鏈接器-》常規-》附加庫目錄添加$(HALCONROOT)/lib/$(HALCONARCH)   並且 在(項目屬性)--(配置屬性)--(C/C++)--(常規)--“附加包含目錄”中添加包含路徑$(HALCONROOT)/include和$(HALCONROOT)/include/halconcpp;
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
 
4.添加文件包含
    在用到圖像處理算子的文件中添加此句:#include"halconcpp.h"。本例子中halcon的算子只在halconMFCDlg中用到,因此只需要在halconMFCDlg.h和halconMFCDlg.cpp中添加此句。在halconMFCDlg.h,#include"halconcpp.h"后添加using namespace Halcon;
 
5.修改對話框,添加兩個按鈕。並增加響應函數。設計的界面如下:
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
 
去掉原來的兩個按鈕,並且添加另外連個按鈕:讀取圖像(IDC_ReadImage)和圖像處理(IDC_ImageProcess)
雙擊兩個按鈕,應用程序框架自動添加消息響應函數,當然我們需要修改此消息響應函數。
 
 
6.根據導出的C++代碼修改響應函數及其他設置。打開生成的C++代碼,
 
6.1 將action()中的變量部分復制到class CHalconMFCDlg: publicCDialog中作為該類的公有成員變量即加入到HalconMFCDlg.h的public:后。即如下所示的代碼段:
 
// HalconMFCDlg.h : 頭文件
//
#include "halconcpp.h"
using namespace Halcon;
#pragma once


// CHalconMFCDlg 對話框
class CHalconMFCDlg : public CDialogEx
{
// 構造
public:
    CHalconMFCDlg(CWnd* pParent = NULL);    // 標准構造函數

// 對話框數據
    enum { IDD = IDD_HALCONMFC_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 實現
protected:
    HICON m_hIcon;

    // 生成的消息映射函數
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedReadimage();
    afx_msg void OnBnClickedImageprocess();

    // Local iconic variables
    Hobject Image, Region, ConnectedRegions, SelectedRegions;
    Hobject RegionClosing, RegionDifference, ConnectedRegions1;
    Hobject SelectedRegions1;
    // Local control variables
    HTuple AcqHandle, Pointer, Type, Width, Height;
    HTuple WindowHandle;
};

6.2 將action()中的打開圖像部分復制到voidCHalconMFCDlg::OnBnClickedReadimage()中。代碼如下所示:

 
     open_framegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default",
         "", "default", -1, -1, &AcqHandle);
     grab_image(&Image, AcqHandle);
     get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
     set_window_attr("background_color","black");
     open_window(0,140,Width/2,Height/2,0,"","",&WindowHandle);
     disp_obj(Image, WindowHandle);    
 
6.3 將action()中的圖像處理部分復制到void CHalconMFCDlg::OnBnClickedImageprocess()中。 代碼如下所示:
 
    set_color(WindowHandle,"red");
    threshold(Image, &Region, 0, 50);
    connection(Region, &ConnectedRegions);
    select_shape(ConnectedRegions, &SelectedRegions, "rect2_len1", "and", 500, 550);
    closing_rectangle1(SelectedRegions, &RegionClosing, 80, 80);
    difference(RegionClosing, SelectedRegions, &RegionDifference);
    connection(RegionDifference, &ConnectedRegions1);
    select_shape(ConnectedRegions1, &SelectedRegions1, "area", "and", 500, 99999);
    clear_window(WindowHandle);
    disp_obj(Image, WindowHandle);
    disp_obj(SelectedRegions1, WindowHandle);
 
7.編譯運行。完成以上步驟以后,點擊編譯,運行。會出現只有兩個按鈕的對話框應用程序,點擊讀取圖像,結果出現這樣的錯誤:
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
    這是因為無法讀取圖像。將要處理的圖像復制到工程目錄下。再次運行。可以正確的讀取圖像,但是,此時的窗口不在對話框中。如下圖所示:
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
 
 
這是因為open_window(0,0,Width/2,Height/2, 0,"","",&WindowHandle);中所指定的父窗口為0,意味着指定的父窗口為桌面,此時需要將其父窗口改為對話框。為此,在該句所在的響應的函數中添加此句:
    Hlong MainWndID =(Hlong) m_hWnd;
並修改open_window的參數,用MainWndID代替0.
 
即改成

set_window_attr("background_color","black");
Hlong MainWndID =(Hlong) m_hWnd;
//open_window(0,140,Width/2,Height/2,0,"","",&WindowHandle);
open_window(0,140,Width/2,Height/2,MainWndID,"","",&WindowHandle);
disp_obj(Image, WindowHandle);

 
最終運行結果如下:
MFC/HALCON混合編程系列一_打開圖像_簡單處理_
與halcon中運行結果一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM