久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3955|回復: 1
打印 上一主題 下一主題
收起左側

給予SVM的手寫數字識別上位機(含源碼)VS2010 + OpenCV2.4.9開發

[復制鏈接]
跳轉到指定樓層
樓主
自己寫了一個基于SVM的數字手寫識別分享給大家;源碼見附件, VS2010 + OpenCV2.4.9開發
識別效果如下圖所示:


VS2010源程序如下:

  1. // HandWriteDlg.cpp : 實現文件
  2. //

  3. #include "stdafx.h"
  4. #include "HandWrite.h"
  5. #include "HandWriteDlg.h"
  6. #include "afxdialogex.h"
  7. #include "opencv2/opencv.hpp"
  8. #include "windows.h"
  9. #include "fstream"
  10. #include <vector>

  11. //#pragma comment(lib,"ml.lib")

  12. using namespace std;
  13. using namespace cv;  

  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #endif


  17. // 用于應用程序“關于”菜單項的 CAboutDlg 對話框

  18. class CAboutDlg : public CDialogEx
  19. {
  20. public:
  21.         CAboutDlg();

  22. // 對話框數據
  23.         enum { IDD = IDD_ABOUTBOX };

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

  26. // 實現
  27. protected:
  28.         DECLARE_MESSAGE_MAP()
  29. };

  30. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  31. {
  32. }

  33. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  34. {
  35.         CDialogEx::DoDataExchange(pDX);
  36. }

  37. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  38. END_MESSAGE_MAP()


  39. // CHandWriteDlg 對話框




  40. CHandWriteDlg::CHandWriteDlg(CWnd* pParent /*=NULL*/)
  41.         : CDialogEx(CHandWriteDlg::IDD, pParent)
  42.         , m_strRes(_T(""))
  43. {
  44.         m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  45. }

  46. void CHandWriteDlg::DoDataExchange(CDataExchange* pDX)
  47. {
  48.         CDialogEx::DoDataExchange(pDX);
  49.         DDX_Text(pDX, IDC_EDIT_RESULT, m_strRes);
  50. }

  51. BEGIN_MESSAGE_MAP(CHandWriteDlg, CDialogEx)
  52.         ON_WM_SYSCOMMAND()
  53.         ON_WM_PAINT()
  54.         ON_WM_QUERYDRAGICON()
  55.         ON_WM_MOUSEMOVE()
  56.         ON_WM_LBUTTONUP()
  57.         ON_WM_LBUTTONDOWN()
  58.         ON_BN_CLICKED(IDC_BUTTON_ERASE, &CHandWriteDlg::OnBnClickedButtonErase)
  59.         ON_BN_CLICKED(IDC_BUTTON_IDENTIFY, &CHandWriteDlg::OnBnClickedButtonIdentify)
  60. END_MESSAGE_MAP()


  61. // CHandWriteDlg 消息處理程序

  62. BOOL CHandWriteDlg::OnInitDialog()
  63. {
  64.         CDialogEx::OnInitDialog();

  65.         // 將“關于...”菜單項添加到系統菜單中。

  66.         // IDM_ABOUTBOX 必須在系統命令范圍內。
  67.         ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  68.         ASSERT(IDM_ABOUTBOX < 0xF000);

  69.         CMenu* pSysMenu = GetSystemMenu(FALSE);
  70.         if (pSysMenu != NULL)
  71.         {
  72.                 BOOL bNameValid;
  73.                 CString strAboutMenu;
  74.                 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  75.                 ASSERT(bNameValid);
  76.                 if (!strAboutMenu.IsEmpty())
  77.                 {
  78.                         pSysMenu->AppendMenu(MF_SEPARATOR);
  79.                         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  80.                 }
  81.         }

  82.         // 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
  83.         //  執行此操作
  84.         SetIcon(m_hIcon, TRUE);                        // 設置大圖標
  85.         SetIcon(m_hIcon, FALSE);                // 設置小圖標

  86.         // TODO: 在此添加額外的初始化代碼

  87.         down_flag = false;
  88.         m_firstFlag = false;
  89.         m_start.x = 0;
  90.         m_start.y = 0;
  91.         m_start.x = 0;
  92.         m_start.y = 0;
  93.         CWnd* pWnd = GetDlgItem(IDC_STATIC_HAND);
  94.         pWnd->GetClientRect(&m_rect); //獲取Picture控件的屏幕坐標區域   
  95.        
  96.         //this->ScreenToClient(&m_rect);


  97.         return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
  98. }

  99. void CHandWriteDlg::OnSysCommand(UINT nID, LPARAM lParam)
  100. {
  101.         if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  102.         {
  103.                 CAboutDlg dlgAbout;
  104.                 dlgAbout.DoModal();
  105.         }
  106.         else
  107.         {
  108.                 CDialogEx::OnSysCommand(nID, lParam);
  109.         }
  110. }

  111. // 如果向對話框添加最小化按鈕,則需要下面的代碼
  112. //  來繪制該圖標。對于使用文檔/視圖模型的 MFC 應用程序,
  113. //  這將由框架自動完成。

  114. void CHandWriteDlg::OnPaint()
  115. {
  116.         if (IsIconic())
  117.         {
  118.                 CPaintDC dc(this); // 用于繪制的設備上下文

  119.                 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  120.                 // 使圖標在工作區矩形中居中
  121.                 int cxIcon = GetSystemMetrics(SM_CXICON);
  122.                 int cyIcon = GetSystemMetrics(SM_CYICON);
  123.                 CRect rect;
  124.                 GetClientRect(&rect);
  125.                 int x = (rect.Width() - cxIcon + 1) / 2;
  126.                 int y = (rect.Height() - cyIcon + 1) / 2;

  127.                 // 繪制圖標
  128.                 dc.DrawIcon(x, y, m_hIcon);
  129.         }
  130.         else
  131.         {
  132.                 CDialogEx::OnPaint();
  133.         }
  134. }

  135. //當用戶拖動最小化窗口時系統調用此函數取得光標
  136. //顯示。
  137. HCURSOR CHandWriteDlg::OnQueryDragIcon()
  138. {
  139.         return static_cast<HCURSOR>(m_hIcon);
  140. }



  141. void CHandWriteDlg::OnMouseMove(UINT nFlags, CPoint point)
  142. {
  143.         // TODO: 在此添加消息處理程序代碼和/或調用默認值
  144.         if (!PtInRect(m_rect,CPoint(point)))
  145.         {
  146.                 down_flag=false;
  147.         }
  148.         CWnd* pWnd = GetDlgItem(IDC_STATIC_HAND);
  149.         CDC* dc = pWnd->GetDC();
  150.         CPen pen(PS_SOLID,10,RGB(0,0,0));
  151.         CPen *pOldPen=dc->SelectObject(&pen); //將其選入設備表
  152.         if (down_flag)
  153.         {
  154.                 dc->MoveTo(m_start);                     /* 開始畫圖 */
  155.                 dc->LineTo(point);
  156.                 m_start=point;
  157.         }
  158.         dc->SelectObject(pOldPen);

  159.         ReleaseDC(dc);
  160.         CDialogEx::OnMouseMove(nFlags, point);
  161. }


  162. void CHandWriteDlg::OnLButtonUp(UINT nFlags, CPoint point)
  163. {
  164.         // TODO: 在此添加消息處理程序代碼和/或調用默認值
  165.         down_flag=false;
  166.         CDialogEx::OnLButtonUp(nFlags, point);
  167. }


  168. void CHandWriteDlg::OnLButtonDown(UINT nFlags, CPoint point)
  169. {
  170.         // TODO: 在此添加消息處理程序代碼和/或調用默認值
  171.         if (PtInRect(m_rect,CPoint(point)))
  172.         {               
  173.                 down_flag=true;
  174.                 m_firstFlag = true;
  175.                 m_start=point;       
  176.         }

  177.         CDialogEx::OnLButtonDown(nFlags, point);
  178. }


  179. void CHandWriteDlg::OnBnClickedButtonErase()
  180. {
  181.         // TODO: 在此添加控件通知處理程序代碼
  182.         m_firstFlag = false;
  183.         Invalidate();
  184. }


  185. void CHandWriteDlg::OnBnClickedButtonIdentify()
  186. {
  187.         // TODO: 在此添加控件通知處理程序代碼
  188.         if(m_firstFlag == false)
  189.         {
  190.                 MessageBox(_T("請現在手寫區寫入數字!"));
  191.                 return ;
  192.         }
  193.        
  194.         CvSVM svm;
  195.         IplImage *test;
  196.         CString strResult;
  197.         char* str;
  198.         CRect pRect;
  199.         CWnd* pwnd=GetDlgItem(IDC_STATIC_HAND);//獲取靜態控件的指針 CRect pRect;
  200.         CDC* pDC=pwnd->GetDC(); //使用控件指針創建繪圖用的DC
  201.         pwnd->GetClientRect(&pRect);
  202.         int w, h;
  203.         w = pRect.right - pRect.left;
  204.         h = pRect.bottom - pRect.top;
  205.         CBitmap bm;
  206.         bm.CreateCompatibleBitmap(pDC, w, h);
  207.         CDC memdc;
  208.         memdc.CreateCompatibleDC(pDC);
  209.         CBitmap*pOld=memdc.SelectObject(&bm);
  210.         memdc.BitBlt( 0, 0, w, h, pDC, pRect.left, pRect.top, SRCCOPY );
  211.         BITMAP btm;
  212.         bm.GetBitmap(&btm);
  213.         DWORD size=btm.bmWidthBytes*btm.bmHeight;
  214.         LPSTR lpData=(LPSTR)::GlobalAlloc(GPTR,size);
  215.         BITMAPINFOHEADER bih;
  216.         bih.biBitCount=btm.bmBitsPixel;
  217.         bih.biClrImportant=0;
  218.         bih.biClrUsed=0;
  219.         bih.biCompression=0;
  220.         bih.biHeight=btm.bmHeight;
  221.         bih.biPlanes=1;
  222.         bih.biSize=sizeof(BITMAPINFOHEADER);
  223.         bih.biSizeImage=size;
  224.         bih.biWidth=btm.bmWidth;
  225.         bih.biXPelsPerMeter=0;
  226.         bih.biYPelsPerMeter=0;
  227.         GetDIBits(memdc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
  228.         BITMAPFILEHEADER bfh;
  229.         bfh.bfReserved1=bfh.bfReserved2=0;
  230.         bfh.bfType=((WORD)('M'<< 8)|'B');
  231.         bfh.bfSize=54+size;
  232.         bfh.bfOffBits=54;

  233.         CFile bf;
  234.         if(bf.Open(_T("a.bmp"),CFile::modeCreate|CFile::modeWrite))
  235.         {
  236.                 bf.Write(&bfh,sizeof(BITMAPFILEHEADER));
  237.                 bf.Write(&bih,sizeof(BITMAPINFOHEADER));
  238.                 bf.Write(lpData,size);
  239. ……………………

  240. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
HandWrite.rar (15.41 MB, 下載次數: 39)




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:418872 發表于 2018-11-1 01:13 | 只看該作者
學習了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91网站在线观看 | 久草www| 午夜在线免费观看 | 国产精品日韩一区 | 人人叉 | 国产亚洲一区在线 | 一级片网站视频 | 一级毛片免费 | 日韩国产一区二区三区 | 亚洲成色777777在线观看影院 | 一级片在线免费播放 | 成人国产精品 | 91国内外精品自在线播放 | 久久久精品一区二区三区 | 欧美国产精品 | 天天操天天插 | 91精品国产91久久久久福利 | 日韩欧美国产精品一区二区三区 | 天天曰天天干 | 亚洲导航深夜福利涩涩屋 | 日本黄色片免费在线观看 | 一级毛毛片| 日韩一级| 国产精品视频导航 | 久久久www成人免费无遮挡大片 | 男人天堂网址 | 91在线精品秘密一区二区 | 国产一区在线免费观看视频 | 欧美日韩精品专区 | 国产欧美日韩一区 | 影音先锋成人资源 | 日本不卡一区二区三区 | 日韩三级一区 | 亚洲精品久久久久久久久久久 | 天堂av中文 | 污视频免费在线观看 | 欧美在线视频一区二区 | 亚洲欧美在线视频 | 日韩免费在线视频 | 一区二区在线 | 亚洲福利片 |