计算机视觉
图像处理

OpenCV学习笔记(13)基于OpenCV2.1的MFC双目视觉平台构建

目前已完成了从 Opencv2.0 到 2.1 版的移植,MFC 平台新增了一些实用的参数调整功能,后面还得结合 OpenGL 来做三维景深的重构,争取学期结束前完成可见光部分的工作,并开始红外成像的立体匹配研究。多机器人协作方面继续保持理论学习和论文阅读,保持对该领域动 态的了解。

附上一段灰度图转伪彩色图的代码,我是用来显示视差图的:

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

试试 Live  Writer 能不能直接发图:

(1)BM 算法

11

33

(2)SGBM 算法

55

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*,对中文字符同样有效)

  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.         if( dlg.DoModal() != IDOK )                 // 判断是否获得图片
  30.         {
  31.             AfxMessageBox(_T(“Can not open image files!”));
  32.             delete []pc;
  33.             GetDlgItem(IDC_BN2StereoCalib)->EnableWindow(TRUE);
  34.             return;
  35.         }
  36.         filePosition = dlg.GetStartPosition();
  37.         while(filePosition != NULL)
  38.         {
  39.             img1Files[nRimg1s++] = dlg.GetNextPathName(filePosition);
  40.         }
  41.         delete []pc;
  42. int j=0;
  43. while(..)
  44. {
  45.             img0_file = img0Files[ j++ ];
  46.             img1_file = img1Files[ j++ ];
  47.             img0 = cvLoadImage(img0_file);
  48.             img1 = cvLoadImage(img1_file);
  49.             if ( !img0 || !img1 || j>= nRimg0s)      break;
  50. }

 

注:使用CFileDialog类并设置 OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。

 

(B) char –> CString

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

转载注明来源:CV视觉网 » OpenCV学习笔记(13)基于OpenCV2.1的MFC双目视觉平台构建

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 4

评论前必须登录!