日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

移動(dòng)設(shè)備上使用opencv 1.10做圖像識(shí)別的舉例說明

出處:by_apple 發(fā)布于:2011-08-24 22:44:54

 

  OpenCV于1999年由Intel建立,現(xiàn)在由Willow Garage提供支持。OpenCV是一個(gè)基于BSD許可證授權(quán)(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),可以運(yùn)行在Linux、Windows和Mac OS操作系統(tǒng)上。它輕量級(jí)而且高效--由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。[1]版本是2.2.OpenCV致力于真實(shí)世界的實(shí)時(shí)應(yīng)用,通過優(yōu)化的C代碼的編寫對(duì)其執(zhí)行速度帶來(lái)了可觀的提升,并且可以通過購(gòu)買Intel的IPP高性能多媒體函數(shù)庫(kù)(Integrated Performance Primitives)得到更快的處理速度。

  圖形刺激作用于感覺器官,人們辨認(rèn)出它是經(jīng)驗(yàn)過的某一圖形的過程,也叫圖像再認(rèn)。在圖像識(shí)別中,既要有當(dāng)時(shí)進(jìn)入感官的信息,也要有記憶中存儲(chǔ)的信息。只有通過存儲(chǔ)的信息與當(dāng)前的信息進(jìn)行比較的加工過程,才能實(shí)現(xiàn)對(duì)圖像的再認(rèn)。人的圖像識(shí)別能力是很強(qiáng)的。圖像距離的改變或圖像在感覺器官上作用位置的改變,都會(huì)造成圖像在視網(wǎng)膜上的大小和形狀的改變。即使在這種情況下,人們?nèi)匀豢梢哉J(rèn)出他們過去知覺過的圖像。甚至圖像識(shí)別可以不受感覺通道的限制。例如,人可以用眼看字,當(dāng)別人在他背上寫字時(shí),他也可認(rèn)出這個(gè)字來(lái)。

  上次說到了如何在WINCE/WM移植Opencv1.10,這次就說說如何在WM手機(jī)上使用裁剪移植后的Open1.10的例子,在opencv上使用OpenSURF,先來(lái)看看本文程序運(yùn)行的截圖:

  左圖為SURF算法找出的特征點(diǎn),右圖為兩個(gè)圖像相似特征點(diǎn)的匹配。

  代碼里包含了自己實(shí)現(xiàn)的MyHighGUI類,用于轉(zhuǎn)換/繪制/保存IplImage圖像,也包含了同時(shí)支持WINCE/WIN32的第三方BMP操作類庫(kù)----DIBSectionCE類。接下來(lái)就貼出部分操作代碼:

  view plaincopy to clipboardprint?

  //*****************************************************************

  //取得程序當(dāng)前文件夾路徑

  //****************************************************************

  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,地址:https://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:提取圖片中的特征點(diǎn)

  IpVec ipts;

  surfDetDes(img, ipts, false, 3, 4, 2, 0.0004f);

  // step3:畫出特征點(diǎn)

  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,地址:https://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:提取圖片中的特征點(diǎn)

  IpVec ipts1, ipts2;

  surfDetDes(img1,ipts1,false,4,4,2,0.0002f);

  surfDetDes(img2,ipts2,false,4,4,2,0.0002f);

  //step3:特征點(diǎn)匹配

  IpPairVec matches;

  getMatches(ipts1,ipts2,matches);

  //step4:畫出匹配的特征點(diǎn),并且連線

  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);

  }

  }

  //*****************************************************************

  //取得程序當(dāng)前文件夾路徑

  //****************************************************************

  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,地址:https://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:提取圖片中的特征點(diǎn)

  IpVec ipts;

  surfDetDes(img, ipts, false, 3, 4, 2, 0.0004f);

  // step3:畫出特征點(diǎn)

  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,地址:https://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:提取圖片中的特征點(diǎn)

  IpVec ipts1, ipts2;

  surfDetDes(img1,ipts1,false,4,4,2,0.0002f);

  surfDetDes(img2,ipts2,false,4,4,2,0.0002f);

  //step3:特征點(diǎn)匹配

  IpPairVec matches;

  getMatches(ipts1,ipts2,matches);

  //step4:畫出匹配的特征點(diǎn),并且連線

  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平臺(tái)上實(shí)現(xiàn)更多Opencv例子,不過,本文程序跑起來(lái)很慢(我用的是460MHz的K3方案 WM手機(jī)),因?yàn)橹挥脴?biāo)準(zhǔn)C的Math做運(yùn)算處理。在ARM9+DSP或者ARM11等手機(jī)上使用Opencv,建議在Opencv的運(yùn)算部分用上這些手機(jī)的專用運(yùn)算指令,這樣可以大大提高運(yùn)算速度。

 



  

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見,您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!