项目源码下载: 从去年12月底起,考试和基金、项目申报的事情一件连着一件,双目视觉的课题给中止了4个月之久,看看论坛和博客上其他朋友所做的工作,自己已落后太多!得奋起直追了,呵呵,目前已完成了从 OpenCV2.0 到 2.1 版的移植,MFC 平台新增了一些实用的参数调整功能,后面还得结合 OpenGL 来做三维景深的重构,争取学期结束前完成可见光部分的工作,并开始红外成像的立体匹配研究。多机器人协作方面继续保持理论学习和论文阅读,保持对该领域动态的了解。 附上一段灰度图转伪彩色图的代码,我是用来显示视差图的: - void CRobotVisionDlg::F_Gray2Color(CvMat* gray_mat, CvMat* color_mat)
- {
- if(color_mat)
- cvZero(color_mat);
-
- int stype = CV_MAT_TYPE(gray_mat->type), dtype = CV_MAT_TYPE(color_mat->type);
- int rows = gray_mat->rows, cols = gray_mat->cols;
-
- if (CV_ARE_SIZES_EQ(gray_mat, color_mat) && stype == CV_8UC1 && dtype == CV_8UC3)
- {
- CvMat* red = cvCreateMat(rows, cols, CV_8U);
- CvMat* green = cvCreateMat(rows, cols, CV_8U);
- CvMat* blue = cvCreateMat(rows, cols, CV_8U);
- CvMat* mask = cvCreateMat(rows, cols, CV_8U);
-
- cvSubRS(gray_mat, cvScalar(255), blue);
- cvCopy(gray_mat, red);
- cvCopy(gray_mat, green);
- cvCmpS(green, 128, mask, CV_CMP_GE );
- cvSubRS(green, cvScalar(255), green, mask);
- cvConvertScale(green, green, 2.0, 0.0);
-
- cvMerge(blue, green, red, NULL, color_mat);
-
- cvReleaseMat( &red );
- cvReleaseMat( &green );
- cvReleaseMat( &blue );
- cvReleaseMat( &mask );
- }
- }
试试 Live Writer 能不能直接发图: (1)BM 算法 (2)SGBM 算法
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*,对中文字符同样有效) - int nRimg0s = 0, nRimg1s = 0;
- IplImage *img0, *img1;
- CStringA img0Files[100], img1Files[100];
- const char* img0_file = NULL, *img1_file = NULL;
- CFileDialog dlg(
- TRUE, _T("*.bmp"), NULL,
- OFN_ENABLESIZING |OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY,
- _T("image files (*.bmp; *.png; *.jpg) |*.bmp; *.png; *.jpg; *.jpeg| All Files (*.*) |*.*||"), NULL
- ); // 选项图片的约定
- DWORD MAXFILE = 4000;
- dlg.m_ofn.nMaxFile = MAXFILE;
- TCHAR* pc = new TCHAR[MAXFILE];
- dlg.m_ofn.lpstrFile = pc;
- dlg.m_ofn.lpstrFile[0] = NULL;
- dlg.m_ofn.lpstrTitle = _T("Select Left/Right Images"); // 打开文件对话框的标题名
- POSITION filePosition;
- if( dlg.DoModal() != IDOK ) // 判断是否获得图片
- {
- AfxMessageBox(_T("Can not open image files!"));
- delete []pc;
- GetDlgItem(IDC_BN2StereoCalib)->EnableWindow(TRUE);
- return;
- }
- filePosition = dlg.GetStartPosition();
- while(filePosition != NULL)
- {
- img0Files[nRimg0s++] = dlg.GetNextPathName(filePosition);
- }
-
- if( dlg.DoModal() != IDOK ) // 判断是否获得图片
- {
- AfxMessageBox(_T("Can not open image files!"));
- delete []pc;
- GetDlgItem(IDC_BN2StereoCalib)->EnableWindow(TRUE);
- return;
- }
- filePosition = dlg.GetStartPosition();
- while(filePosition != NULL)
- {
- img1Files[nRimg1s++] = dlg.GetNextPathName(filePosition);
- }
- delete []pc;
- ...
- int j=0;
- while(..)
- {
- img0_file = img0Files[ j++ ];
- img1_file = img1Files[ j++ ];
- img0 = cvLoadImage(img0_file);
- img1 = cvLoadImage(img1_file);
- if ( !img0 || !img1 || j>= nRimg0s) break;
- ...
- }
注:使用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 - // 在组合框CamList中添加摄像头名称的字符串
- char camera_name[1024];
- char istr[25];
- CString camstr;
- for(int i=0; i < cam_count; i++)
- {
- int retval = CCameraDS::CameraName(i, camera_name, sizeof(camera_name) );
- sprintf_s(istr, " # %d", i);
- strcat_s( camera_name, istr );
- camstr = camera_name;
- //camstr.Format("%s%s", camera_name, istr);
- //lstrcat(camera_name, istr);
- if(retval >0)
- m_CBNCamList.AddString(camstr);
- else
- AfxMessageBox(_T("不能获取摄像头的名称"));
- }
- camstr.ReleaseBuffer();
|