OpenCV學習筆記(13)基於OpenCV2.1的MFC雙目視覺平台構建

http://blog.csdn.net/chenyusiyuan/article/details/5628982

從去年12月底起,考試和基金、項目申報的事情一件連著一件,雙目視覺的課題給中止了4個月之久,看看論壇和博客上其他朋友所做的工作,自己已落後太多!得奮起直追了,呵呵,目前已完成了從 OpenCV2.0 到 2.1 版的移植,MFC 平台新增了一些實用的參數調整功能,後面還得結合 OpenGL 來做三維景深的重構,爭取學期結束前完成可見光部分的工作,並開始紅外成像的立體匹配研究。多機器人協作方面繼續保持理論學習和論文閱讀,保持對該領域動態的了解。

附上一段灰度圖轉偽彩色圖的代碼,我是用來顯示視差圖的:


   
   
   
   
[cpp] view plain copy
  1. void CRobotVisionDlg::F_Gray2Color(CvMat* gray_mat, CvMat* color_mat)  
  2. {  
  3.     if(color_mat)  
  4.         cvZero(color_mat);  
  5.           
  6.     int stype = CV_MAT_TYPE(gray_mat->type), dtype = CV_MAT_TYPE(color_mat->type);  
  7.     int rows = gray_mat->rows, cols = gray_mat->cols;  
  8.       
  9.     if (CV_ARE_SIZES_EQ(gray_mat, color_mat) && stype == CV_8UC1 && dtype == CV_8UC3)  
  10.     {  
  11.         CvMat* red = cvCreateMat(rows, cols, CV_8U);  
  12.         CvMat* green = cvCreateMat(rows, cols, CV_8U);  
  13.         CvMat* blue = cvCreateMat(rows, cols, CV_8U);  
  14.         CvMat* mask = cvCreateMat(rows, cols, CV_8U);  
  15.   
  16.         cvSubRS(gray_mat, cvScalar(255), blue);  
  17.         cvCopy(gray_mat, red);  
  18.         cvCopy(gray_mat, green);  
  19.         cvCmpS(green, 128, mask, CV_CMP_GE );  
  20.         cvSubRS(green, cvScalar(255), green, mask);  
  21.         cvConvertScale(green, green, 2.0, 0.0);  
  22.   
  23.         cvMerge(blue, green, red, NULL, color_mat);  
  24.   
  25.         cvReleaseMat( &red );  
  26.         cvReleaseMat( &green );  
  27.         cvReleaseMat( &blue );  
  28.         cvReleaseMat( &mask );  
  29.     }  
  30. }  

試試 Live  Writer 能不能直接發圖:

(1)BM 算法

OpenCV學習筆記(13)基於OpenCV2.1的MFC雙目視覺平台構建_第1张图片

OpenCV學習筆記(13)基於OpenCV2.1的MFC雙目視覺平台構建_第2张图片

(2)SGBM 算法

OpenCV學習筆記(13)基於OpenCV2.1的MFC雙目視覺平台構建_第3张图片

 

P.S.

(1)只有采用 UNICODE 字符集 才能使 MFC 界面顯示為 XP 樣式(見 stdafx.h 最後部分的 #ifdef _UNICODE),否則界面顯示為 Windows98/2000 樣式。

UNICODE 字符集的設置:Project - *** Properties - Configuration Properties - General - Character Set - Use Unicode Character Set 。

 

(2)CString 與 char* 的變換:

(A) CSting --> const char* (使用 CStringA 可以很方便地轉換至 const char*,對中文字符同樣有效)

[c-sharp]  view plain copy
  1.     int nRimg0s = 0, nRimg1s = 0;  
  2.     IplImage *img0, *img1;  
  3.     CStringA img0Files[100], img1Files[100];  
  4.     const char* img0_file = NULL, *img1_file = NULL;  
  5. CFileDialog dlg(  
  6.             TRUE, _T("*.bmp"), NULL,  
  7.             OFN_ENABLESIZING   |OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY,  
  8.             _T("image files (*.bmp; *.png; *.jpg) |*.bmp; *.png; *.jpg; *.jpeg| All Files (*.*) |*.*||"), NULL  
  9.             );                                      // 選項圖片的約定  
  10.         DWORD MAXFILE = 4000;     
  11.         dlg.m_ofn.nMaxFile = MAXFILE;  
  12.         TCHAR* pc = new TCHAR[MAXFILE];     
  13.         dlg.m_ofn.lpstrFile = pc;     
  14.         dlg.m_ofn.lpstrFile[0] = NULL;   
  15.         dlg.m_ofn.lpstrTitle = _T("Select Left/Right Images");   // 打開文件對話框的標題名  
  16.         POSITION filePosition;  
  17.         if( dlg.DoModal() != IDOK )                 // 判斷是否獲得圖片  
  18.         {  
  19.             AfxMessageBox(_T("Can not open image files!"));  
  20.             delete []pc;  
  21.             GetDlgItem(IDC_BN2StereoCalib)->EnableWindow(TRUE);  
  22.             return;  
  23.         }  
  24.         filePosition = dlg.GetStartPosition();  
  25.         while(filePosition != NULL)     
  26.         {     
  27.             img0Files[nRimg0s++] = dlg.GetNextPathName(filePosition);    
  28.         }     
  29.   
  30.         if( dlg.DoModal() != IDOK )                 // 判斷是否獲得圖片  
  31.         {  
  32.             AfxMessageBox(_T("Can not open image files!"));  
  33.             delete []pc;  
  34.             GetDlgItem(IDC_BN2StereoCalib)->EnableWindow(TRUE);  
  35.             return;  
  36.         }  
  37.         filePosition = dlg.GetStartPosition();  
  38.         while(filePosition != NULL)     
  39.         {     
  40.             img1Files[nRimg1s++] = dlg.GetNextPathName(filePosition);    
  41.         }     
  42.         delete []pc;  
  43. ...  
  44. int j=0;  
  45. while(..)  
  46. {  
  47.             img0_file = img0Files[ j++ ];  
  48.             img1_file = img1Files[ j++ ];  
  49.             img0 = cvLoadImage(img0_file);  
  50.             img1 = cvLoadImage(img1_file);  
  51.             if ( !img0 || !img1 || j>= nRimg0s)      break;  
  52. ...  
  53. }  
 

注:使用CFileDialog類並設置 OFN_ALLOWMULTISELECT標志時,OPENFILENAME結構體的lpstrFile成員是一個指向用戶申請分配的緩沖區,裡面接受所選的路徑和文件名列表,這個列表的每一項由一個NULL隔開,最末以兩個NULL結束。nMaxFile成員指明了緩沖區的大小,如果所選擇的文件名的加起來的總長度超過了此值,則DoModal函數返回IDCANCEL,如果用戶試圖打開超過緩沖區大小的文件集的話,CommDlgExtendedError()將返回FNERR_BUFFERTOOSMALL,這時候,lpstrFile的前兩個byte將會包含實際需要的緩沖區的字節數。
(摘自CSDN博客:http://blog.csdn.net/FlowShell/archive/2009/10/08/4643167.aspx) 

 

(B) char --> CString

[c-sharp]  view plain copy
  1. // 在組合框CamList中添加攝像頭名稱的字符串  
  2. char camera_name[1024];  
  3. char istr[25];  
  4. CString camstr;  
  5. for(int i=0; i < cam_count; i++)  
  6. {    
  7.     int retval = CCameraDS::CameraName(i, camera_name, sizeof(camera_name) );  
  8.     sprintf_s(istr, " # %d", i);  
  9.     strcat_s( camera_name, istr );    
  10.     camstr = camera_name;  
  11.     //camstr.Format("%s%s", camera_name, istr);       
  12.     //lstrcat(camera_name, istr);  
  13.     if(retval >0)  
  14.         m_CBNCamList.AddString(camstr);  
  15.     else  
  16.         AfxMessageBox(_T("不能獲取攝像頭的名稱"));  
  17. }  
  18. camstr.ReleaseBuffer();  
 


你可能感兴趣的:(OpenCV學習筆記(13)基於OpenCV2.1的MFC雙目視覺平台構建)