1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MFC+Halcon 真正实现图像缩放 平移

MFC+Halcon 真正实现图像缩放 平移

时间:2021-06-03 23:26:17

相关推荐

MFC+Halcon 真正实现图像缩放 平移

网上看了几个MFC+Halcon对图像进行缩放、平移,发现很多是不完整或者没有真正实现这2个功能,所以自己去真正实现

实现平台:VS+HALCON18.11。

主要知识点:

1、halcon与MFC窗口关联

2、halcon几个简单函数的使用比如

OpenWindow

ReadImage

GetImageSize

ClearWindow

SetPart

DispObj

核心代码:

#pragma once#include "afxwin.h"// CLocationDlg dialogclass CLocationDlg : public CDialogEx{// Constructionpublic:CLocationDlg(CWnd* pParent = NULL);// standard constructor// Dialog Dataenum { IDD = IDD_LOCATION_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV supportpublic:bool InitHalconWindow(CWnd *hWnd, HTuple &hWindow);//创建关联halcon窗口句柄void DisPlayImage(HObject hImageSrc,HTuple hWindow);//显示图片public:HTuple m_hWindow;//halcon窗口句柄bool m_bInitHalconWindow;//halcon窗口句柄是否创建成功HObject m_hImage;//halcon图片句柄double m_dScale;//缩放倍数CPoint m_ptStart;//鼠标拖动的起点CPoint m_ptEnd;//鼠标拖动的终点int m_nHeightOffset;//偏移量int m_nWidthOffset;CString m_strFilePath;//图片路径// Implementationprotected:HICON m_hIcon;// Generated message map functionsvirtual 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 OnBnClickedButtonOpenImage();virtual BOOL PreTranslateMessage(MSG* pMsg);CStatic m_staticImage;afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);afx_msg void OnBnClickedButtonReset();};

InitHalconWindow创建halcon与图像控件Static关联的窗口显示图片句柄

bool CLocationDlg::InitHalconWindow(CWnd *hWnd, HTuple &hWindow){if (NULL == hWnd){return false;}//hWindow.Reset();try{CRect rc;hWnd->GetClientRect(rc);SetWindowAttr("background_color","gray"); //设置图片窗口背景颜色为灰色OpenWindow(0, 0, rc.Width(), rc.Height(), (Hlong)hWnd->GetSafeHwnd(), "visible", "", &hWindow);SetDraw(hWindow,"margin");SetColor(hWindow,"red");SetLineWidth(hWindow,1);}catch(HException &except){CString strErr = except.ErrorMessage();return false;}return true;}

DisPlayImage显示图片

//图像显示void CLocationDlg::DisPlayImage(HObject hImageSrc,HTuple hWindow){//判断hImageSrc是否加载图片初始化if (!hImageSrc.IsInitialized()){return;}HTuple hImageWidth; //图片原始宽度HTuple hImageHeight;//图片原始高度GetImageSize(hImageSrc, &hImageWidth, &hImageHeight);int nImageHeight = hImageHeight.I();int nImageWidth = hImageWidth.I();double Row1 = nImageHeight*m_dScale-m_nHeightOffset;double Column1 = nImageWidth*m_dScale-m_nWidthOffset;double Row2 = nImageHeight - nImageHeight*m_dScale-m_nHeightOffset;double Column2 = nImageWidth - nImageWidth*m_dScale-m_nWidthOffset;ClearWindow(hWindow);SetPart(hWindow,Row1,Column1,Row2,Column2);DispObj(hImageSrc,hWindow); }

鼠标滚轮缩放

BOOL CLocationDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){// TODO: Add your message handler code here and/or call defaultdouble dAddScal = 0.05;if(zDelta>0){if (fabs(m_dScale+dAddScal - 0.5)>1e-6){m_dScale +=dAddScal;DisPlayImage(m_hImage,m_hWindow);}}else{if (fabs(m_dScale-dAddScal+2)>1e-6){m_dScale -=dAddScal;DisPlayImage(m_hImage,m_hWindow);}}return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);}

偏移处理

BOOL CLocationDlg::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classif (pMsg->message==WM_LBUTTONDOWN) {CPoint point;GetCursorPos(&point);CPoint pt = point;ScreenToClient(&pt);CRect rc;m_staticImage.GetClientRect(&rc);if (rc.PtInRect(pt)){m_ptStart = pt;m_ptEnd = pt;}}else if (pMsg->message==WM_LBUTTONUP) {CPoint point;GetCursorPos(&point);CPoint pt = point;ScreenToClient(&pt);CRect rc;m_staticImage.GetClientRect(&rc);if (rc.PtInRect(pt)){m_ptEnd = pt;m_nWidthOffset += (m_ptEnd.x - m_ptStart.x);m_nHeightOffset += (m_ptEnd.y - m_ptStart.y);DisPlayImage(m_hImage,m_hWindow);}}return CDialogEx::PreTranslateMessage(pMsg);}

打开图片

void CLocationDlg::OnBnClickedButtonOpenImage(){// TODO: Add your control notification handler code hereif (!m_bInitHalconWindow){MessageBox(_T("创建halcon窗口句柄失败"),_T("提示"),MB_OK|MB_ICONWARNING);return;}CFileDialog FileDlg(TRUE,_T("bmp"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(" (*.bmp)|*.bmp|所有文件 (*.*)|*.*||"),NULL);if(FileDlg.DoModal() == IDOK){m_strFilePath = FileDlg.GetPathName();//文件全路径}else{m_strFilePath = _T("");}if (m_strFilePath.IsEmpty()){return;}m_hImage.Reset();ReadImage(&m_hImage,m_strFilePath.GetBuffer(0));m_strFilePath.ReleaseBuffer();m_dScale = 0;//重置m_nHeightOffset = 0;m_nWidthOffset = 0;DisPlayImage(m_hImage,m_hWindow);}

具体工程代码:

因为我安装的halcon的是64位的所以工程编译是也选择64位。

/download/death10001/15290010

由于halcon的dll和lib文件过大,无法上传 请用户自己把halcon的MVTec文件拷贝到工程目录并且重新配置一下头文件和链接库。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。