智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

移動設備上使用opencv 1.10做圖像識別的例子

來源:網(wǎng)絡

點擊:2559

A+ A-

所屬頻道:新聞中心

關鍵詞: Windows-Mobile,移動設備

        上次說到了如何在WINCE/WM移植Opencv1.10,這次就說說如何在WM手機上使用裁剪移植后的Open1.10的例子,在opencv上使用OpenSURF(OpenSURF在GoogleCode的地址:http://code.google.com/p/opensurf1/),先來看看本文程序運行的截圖: 

    左圖為SURF算法找出的特征點,右圖為兩個圖像相似特征點的匹配。

        本文的代碼可以到http://www.rayfile.com/zh-cn/files/da4d4edc-8af5-11df-9dac-0015c55db73d/這里下載,代碼里包含了自己實現(xiàn)的MyHighGUI類,用于轉(zhuǎn)換/繪制/保存IplImage圖像,也包含了同時支持WINCE/WIN32的第三方BMP操作類庫----DIBSectionCE類(詳見http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3),接下來就貼出部分操作代碼:

    view plaincopy to clipboardprint?
    //*****************************************************************  
    //取得程序當前文件夾路徑  
    //****************************************************************  
    CString GetCurrentDirectory()    
    {    
        wchar_t pBuf[256];    
        GetModuleFileName(NULL,pBuf,sizeof(pBuf)/sizeof(wchar_t));    
        CString strPath(pBuf);    
        strPath = strPath.Left(strPath.ReverseFind('\\') + 1);    
        delete pBuf;  
        return strPath;  
    }  
     
    void CtestDlg::OnBnClickedButton1()  
    {  
        //自定義的HighGUI,詳見MyHighGUI.h  
        MyHighGUI gui;  
        //網(wǎng)上的BMP操作類,支持WINCE/WIN32,地址:http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3   
        CDIBSectionCE ce;  
        //step1:讀取BMP,并轉(zhuǎn)換為IplImage格式  
        CString bmpPath=GetCurrentDirectory()+L"car1.bmp";  
        ce.Load(bmpPath);  
        int nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ;      
        IplImage* img = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);  
        ce.DeleteObject();  
     
        //step2:提取圖片中的特征點  
        IpVec ipts;  
        surfDetDes(img, ipts, false, 3, 4, 2, 0.0004f);  
     
        // step3:畫出特征點    
        drawIpoints(img, ipts);  
        gui.Show(img,::GetDC(this->m_hWnd),0,0,img->width,img->height);  
        //gui.WriteBmp(L"img33.bmp",(BYTE *)img->imageData,img->imageSize,img->width,img->height);  
         img=NULL;  
    }  
     
    void CtestDlg::OnBnClickedButton2()  
    {  
        //自定義的HighGUI,詳見MyHighGUI.h  
        MyHighGUI gui;  
        //網(wǎng)上的BMP操作類,支持WINCE/WIN32,地址:http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3   
        CDIBSectionCE ce;  
        //step1:讀取BMP,并轉(zhuǎn)換為IplImage格式  
        CString bmpPath=GetCurrentDirectory()+L"car1.bmp";  
        ce.Load(bmpPath);  
        int nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ;      
        IplImage* img1 = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);  
        ce.DeleteObject();  
     
        bmpPath=GetCurrentDirectory()+L"car2.bmp";  
        ce.Load(bmpPath);  
        nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ;  
        IplImage* img2 = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);  
        ce.DeleteObject();  
     
        //step2:提取圖片中的特征點  
        IpVec ipts1, ipts2;  
        surfDetDes(img1,ipts1,false,4,4,2,0.0002f);  
        surfDetDes(img2,ipts2,false,4,4,2,0.0002f);  
     
        //step3:特征點匹配  
        IpPairVec matches;  
        getMatches(ipts1,ipts2,matches);  
     
        //step4:畫出匹配的特征點,并且連線  
        for (unsigned int i = 0; i < matches.size(); ++i)  
        {  
            drawPoint(img1,matches[i].first);  
            drawPoint(img2,matches[i].second);  
            
            int w = img1->width;  
            cvLine(img1,cvPoint(matches[i].first.x,matches[i].first.y),cvPoint(matches[i].second.x+w,matches[i].second.y), cvScalar(123,123,123),1);  
            cvLine(img2,cvPoint(matches[i].first.x-w,matches[i].first.y),cvPoint(matches[i].second.x,matches[i].second.y), cvScalar(123,123,123),1);    
        }  
     
        //畫到屏幕上  
        if(img1->height>img2->height)  
        {     
            gui.Show(img1,::GetDC(this->m_hWnd),0,0,img1->width,img1->height);  
            gui.Show(img2,::GetDC(this->m_hWnd),img1->width,img1->height-img2->height,img2->width,img2->height);  
        }  
        else 
        {  
            gui.Show(img1,::GetDC(this->m_hWnd),0,img2->height-img1->height,img1->width,img1->height);  
            gui.Show(img2,::GetDC(this->m_hWnd),img1->width,0,img2->width,img2->height);  
        }  
     

    //*****************************************************************
    //取得程序當前文件夾路徑
    //****************************************************************
    CString GetCurrentDirectory() 

     wchar_t pBuf[256]; 
     GetModuleFileName(NULL,pBuf,sizeof(pBuf)/sizeof(wchar_t)); 
     CString strPath(pBuf); 
     strPath = strPath.Left(strPath.ReverseFind('\\') + 1); 
     delete pBuf;
     return strPath;
    }

    void CtestDlg::OnBnClickedButton1()
    {
     //自定義的HighGUI,詳見MyHighGUI.h
     MyHighGUI gui;
     //網(wǎng)上的BMP操作類,支持WINCE/WIN32,地址:http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3
     CDIBSectionCE ce;
     //step1:讀取BMP,并轉(zhuǎn)換為IplImage格式
     CString bmpPath=GetCurrentDirectory()+L"car1.bmp";
     ce.Load(bmpPath);
     int nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ; 
     IplImage* img = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);
        ce.DeleteObject();

     //step2:提取圖片中的特征點
     IpVec ipts;
     surfDetDes(img, ipts, false, 3, 4, 2, 0.0004f);

     // step3:畫出特征點 
     drawIpoints(img, ipts);
     gui.Show(img,::GetDC(this->m_hWnd),0,0,img->width,img->height);
     //gui.WriteBmp(L"img33.bmp",(BYTE *)img->imageData,img->imageSize,img->width,img->height);
      img=NULL;
    }

    void CtestDlg::OnBnClickedButton2()
    {
     //自定義的HighGUI,詳見MyHighGUI.h
     MyHighGUI gui;
     //網(wǎng)上的BMP操作類,支持WINCE/WIN32,地址:http://www.codeguru.com/cpp/w-p/ce/bitmapsandthegdi/article.php/c3
     CDIBSectionCE ce;
     //step1:讀取BMP,并轉(zhuǎn)換為IplImage格式
     CString bmpPath=GetCurrentDirectory()+L"car1.bmp";
     ce.Load(bmpPath);
     int nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ; 
     IplImage* img1 = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);
     ce.DeleteObject();

     bmpPath=GetCurrentDirectory()+L"car2.bmp";
     ce.Load(bmpPath);
     nChannels = ce.GetBitmapInfo()->bmiHeader.biBitCount /8 ;
     IplImage* img2 = gui.BMP2Ipl((BYTE*)ce.GetDIBits(),ce.GetWidth(),ce.GetHeight(),nChannels);
     ce.DeleteObject();

     //step2:提取圖片中的特征點
        IpVec ipts1, ipts2;
        surfDetDes(img1,ipts1,false,4,4,2,0.0002f);
        surfDetDes(img2,ipts2,false,4,4,2,0.0002f);

     //step3:特征點匹配
        IpPairVec matches;
        getMatches(ipts1,ipts2,matches);

     //step4:畫出匹配的特征點,并且連線
     for (unsigned int i = 0; i < matches.size(); ++i)
     {
      drawPoint(img1,matches[i].first);
      drawPoint(img2,matches[i].second);
      
      int w = img1->width;
      cvLine(img1,cvPoint(matches[i].first.x,matches[i].first.y),cvPoint(matches[i].second.x+w,matches[i].second.y), cvScalar(123,123,123),1);
      cvLine(img2,cvPoint(matches[i].first.x-w,matches[i].first.y),cvPoint(matches[i].second.x,matches[i].second.y), cvScalar(123,123,123),1); 
     }

     //畫到屏幕上
     if(img1->height>img2->height)
     { 
      gui.Show(img1,::GetDC(this->m_hWnd),0,0,img1->width,img1->height);
      gui.Show(img2,::GetDC(this->m_hWnd),img1->width,img1->height-img2->height,img2->width,img2->height);
     }
     else
     {
      gui.Show(img1,::GetDC(this->m_hWnd),0,img2->height-img1->height,img1->width,img1->height);
      gui.Show(img2,::GetDC(this->m_hWnd),img1->width,0,img2->width,img2->height);
     }

    }
     

    用戶可以根據(jù)本文的操作代碼,在WINCE/WM平臺上實現(xiàn)更多Opencv例子,不過,本文程序跑起來很慢(我用的是460MHz的K3方案 WM手機),因為只用標準C的Math做運算處理。在ARM9+DSP或者ARM11等手機上使用Opencv,建議在Opencv的運算部分用上這些手機的專用運算指令,這樣可以大大提高運算速度。

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡及各大主流媒體。版權歸原作者所有。如認為內(nèi)容侵權,請聯(lián)系我們刪除。

    主站蜘蛛池模板: 校服定做厂家-屹奥校服-无限能量·校园绽放 | 消防巡检柜-EPS应急电源-交直流屏厂家-中央信号屏-万正电源 | 装盒机|全自动封盒机|纸盒子包装机|高速装盒机定制-温州胜泰机械有限公司 | 真人外教一对一_在线英语培训_成人英语培训【春喜外语学习官网】 | 网带窑,催化剂网带窑,电热回转窑-淄博圣元窑炉工程有限公司 | 长沙网站建设,网站设计制作,长沙小程序开发,公众号开发,长沙叶老设计 | 清关公司_进口报关公司【恒邦】进口报关流程及费用 | 免费建站_自助建站_网站建设_企业建站_中小企业建网站_免费网站模板-牵牛建站 | 连云港机械手厂家_全自动焊接机械手_刀轴焊接机_智能轴类焊接机_连云港建博自动化设备有限公司 | 煤粉喷枪_高炉喷煤枪_陶瓷喷煤枪-北京耐默公司 | 吸污车|吸粪车|冷藏车|消防车|清障车|环卫垃圾车价格|湖北程力汽车集团厂家销售公司 | 聚丙烯酰胺,聚合氯化铝,重金属捕捉剂,污泥调理剂,活性氧化铝,生石灰,反渗透阻垢剂,工业葡萄糖,硫酸铝,果壳活性炭,柱状活性炭,蜂窝活性炭,石英砂,锰砂-北京雁归来环保科技有限公司-以真诚为立足之本,以质量为生存之本,愿与海内外同仁共创双赢。雁归来人一路走来,气贯长虹,勇锐盖过怯弱,进取压倒苟安!我们紧扣时代脉搏,专注水处理、继往开来! | 温湿度记录仪_温度监控_冷链监控云平台_USB/PDF温度记录仪-深圳市鸿睿物联科技发展有限公司 | 紫外线光疗仪|白癜风光疗仪|牛皮癣治疗仪|308纳米led|SIGMA|上海希格玛高技术有限公司 | 浙江云野科技有限公司_智慧旅游规划_智慧景区管理系统_全域旅游解决方案-云野科技旅游大数据管理平台 | 集装箱零配件_不锈钢丝绳厂家_镀锌铁链条_合页非标件定制_上海英鑫多实业有限公司 | 烟气在线监测系统_VOCs在线监测_分析仪「杭州世驰科技」 | 世博磁力泵,耐腐蚀磁力泵,耐酸碱磁力泵,氟塑料磁力泵-苏州冠裕机电科技有限公司 | 叛逆孩子改造,青少年行为矫正,戒网瘾学校,特训学校,全封闭军事化管理学校 | 做网站_网站建设_专业上海网站制作_网至普网站建设 | 石牌坊价格_石雕农村门楼图片_石牌楼雕刻制作 _ 长城石雕 | 五金冲压件生产厂家_加工五金拉伸件-沧州浚鼎机械制造有限公司-沧州浚鼎机械制造有限公司 | 五凌汽配-轮胎螺丝|中心螺丝|小螺丝|轮胎螺栓|扭力杆螺丝|高强度紧固件|螺丝螺母|汽车配件 | 沼气池-沼气设备-沼气工程-山东达禹环境工程有限公司 | 普利塞HS穿刺活检针-巴德穿刺活检针-美创爱琅Argon活检针同轴针-山东瑞玺源 | 硬度计,里氏硬度计,布氏硬度计,高强螺栓检测仪,平板导热仪,专业无损检测仪器商-北京时代新天测控技术有限公司-北京时代新天测控技术有限公司 | 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 - 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 | 机锋网-畅享科技品质生活,尽在机锋网 | 威海实木家具-威海定制家具-威海家具-威海至佳百隆家具有限公司 威海木箱,威海木托盘,威海免熏蒸包装箱-威海耀晟木制品有限公司 | 医院,小型生活污水处理设备-山东明基环保设备有限公司 | 智能访客系统 - 来访登记系统_微信预约系统_人员出入管理系统_访客机_人脸识别系统门禁闸机 | 无锡市一格机械设备有限公司【官网】 | 专业制造泥浆泵阀箱、锻造零件、曲轴、台阶轴等各种机械部件 - 四川中宇重工科技有限公司 | 聚丙烯酰胺,聚合氯化铝,重金属捕捉剂,污泥调理剂,活性氧化铝,生石灰,反渗透阻垢剂,工业葡萄糖,硫酸铝,果壳活性炭,柱状活性炭,蜂窝活性炭,石英砂,锰砂-北京雁归来环保科技有限公司-以真诚为立足之本,以质量为生存之本,愿与海内外同仁共创双赢。雁归来人一路走来,气贯长虹,勇锐盖过怯弱,进取压倒苟安!我们紧扣时代脉搏,专注水处理、继往开来! | 西安西雷脉冲功率技术有限公司-高压调制器/加速器与脉冲功率系统的研发/生产/应用推广/高压脉冲电源的应用研究/设计/生产和销售/高功率脉冲器件/材料与仪器设备的研发/生产和销售/高电压/大电流/强磁场环境的模拟及测试服务/会议会展服务/货物及进出口的业务/脉冲功率技术领域类的技术转让 | 康拓威技术(深圳)有限公司|Theia镜头代理商|安讯士AXIS摄像机|安讯士监控系统|博世BOSCH监控|博世会议系统|索尼SONY监控|松下PANASONIC监控|三星韩华SAMSUNG监控|霍尼韦尔Honeywell|海康|大华|华为监控|Theia无畸变镜头|AXIS监控|安讯视摄像机 | 锦州龙威机械有限公司官网 ,锦州医药包装机,包装机,锦州包装机械,小袋颗粒装盒生产线,颗粒装盒生产线,软双铝装盒线,伺服颗粒 | 污水处理控制系统设计_plc编程控制柜_电气成套设备生产厂家_合肥鸿昇自动化 | 英格索兰空压机_英格索兰空压机配件_英格索兰空压机维修—商天机械 | 玉米加工机械_玉米加工设备_玉米深加工机械_玉米糁加工设备--滑县鑫丰粮油机械有限公司 | 佳龙食品集团|高端辣条领导品牌 加药装置-排油烟装置-工业滤水器-连云港灵动 |