当前位置:首页 > 图像处理opencv代码
}
void CmymfcDlg::OnBnClickedReadimg() //读取图片操作 { // TODO: 在此添加控件通知处理程序代码 // 这里用CFileDialog来选择图片 CFileDialog dlg( TRUE, _T(\ OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T(\ );
// 打开文件对话框的标题名
dlg.m_ofn.lpstrTitle = _T(\
// 判断是否获得图片 if( dlg.DoModal() != IDOK ) return; // 获取图片路径 CString mPath = dlg.GetPathName(); rePath = mPath; // 读取图片 IplImage* ipl = cvLoadImage( mPath, 1 ); // 判断是否成功读取图片 if( !ipl ) return; if( TheImage ) cvZero( TheImage ); ResizeImage( ipl ); ShowImage( TheImage,IDC_ShowImg); cvReleaseImage( &ipl ); }
void CmymfcDlg::ShowImage(IplImage* img, UINT ID) // ID 是Picture Control控件的ID号 { // 获得显示控件的 DC
CDC* pDC = GetDlgItem( ID ) ->GetDC(); // 获取 HDC(设备句柄) 来进行绘图操作 HDC hDC = pDC ->GetSafeHdc(); CRect rect;
GetDlgItem(ID) ->GetClientRect( &rect ); // 求出图片控件的宽和高 int rw = rect.right - rect.left; int rh = rect.bottom - rect.top; // 读取图片的宽和高 int iw = img->width; int ih = img->height;
// 使图片的显示位置正好在控件的正中 int tx = (int)(rw - iw)/2; int ty = (int)(rh - ih)/2;
SetRect( rect, tx, ty, tx+iw, ty+ih );
// 复制图片 CvvImage cimg; cimg.CopyOf( img ); // 将图片绘制到显示控件的指定区域内 cimg.DrawToHDC( hDC, &rect ); ReleaseDC( pDC ); }
void CmymfcDlg::ResizeImage(IplImage* img) { // 读取图片的宽和高 int w = img->width; int h = img->height;
// 找出宽和高中的较大值者 int max = (w > h)? w: h;
// 计算将图片缩放到TheImage区域所需的比例 float scale = (float) ( (float) max / 256.0f ); // 缩放后图片的宽和高 int nw = (int)( w/scale ); int nh = (int)( h/scale ); // 为了将缩放后的图片存入 TheImage 的正中部位,需计算图片在 TheImage 左上角的期望坐标值
}
int tlx = (nw > nh)? 0: (int)(256-nw)/2; int tly = (nw > nh)? (int)(256-nh)/2: 0;
// 设置 TheImage 的 ROI 区域,用来存入图片 img cvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) ); // 对图片 img 进行缩放,并存入到 TheImage 中 cvResize( img, TheImage );
// 重置 TheImage 的 ROI 准备读入下一幅图片 cvResetImageROI( TheImage );
void CmymfcDlg::OnBnClickedEdgedetect() //Canny算法的边缘检测 {
// TODO: 在此添加控件通知处理程序代码 IplImage *gray = 0, *edge = 0;
gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_BGR2GRAY ); cvCanny( gray, edge, 30, 100, 3 );
ShowImage( edge, IDC_ShowImg ); // 调用显示图片函数
cvReleaseImage( &gray ); cvReleaseImage( &edge ); }
void CmymfcDlg::OnBnClickedRefresh() //恢复图片 { // TODO: 在此添加控件通知处理程序代码 //将读入的图片路径传给mPath CString mPath = rePath; // 读取图片、缓存到一个局部变量 ipl 中 IplImage* ipl = cvLoadImage( mPath, 1 ); // 判断是否成功读取图片 if( !ipl ) return; // 对上一幅显示的图片数据清零 if( TheImage ) cvZero( TheImage ); // 对读入的图片进行缩放,使其宽或高最大值者刚好等于 256,再复制到 TheImage 中 ResizeImage( ipl );
}
// 调用显示图片函数
ShowImage( TheImage,IDC_ShowImg);
void CmymfcDlg::OnBnClickedGrayprocess() //灰度图像的转化 { // TODO: 在此添加控件通知处理程序代码 IplImage *gray = 0;
gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_RGB2GRAY ); ShowImage( gray, IDC_ShowImg ); }
//释放图片的内存空间 cvReleaseImage( &gray );
void CmymfcDlg::OnBnClickedSobel() //用cvSobel函数的边缘检测 { // TODO: 在此添加控件通知处理程序代码 IplImage *gray = 0, *edge = 0;
gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_BGR2GRAY ); cvSobel( gray, edge, 1, 0, 3 );
ShowImage( edge, IDC_ShowImg ); // 调用显示图片函数 cvReleaseImage( &gray ); cvReleaseImage( &edge ); }
void CmymfcDlg::OnBnClickedLaplace() //用cvLaplace函数实现图像的拉普拉斯变换 { // TODO: 在此添加控件通知处理程序代码 IplImage *gray = 0, *edge = 0;
gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 ); cvCvtColor( TheImage, gray, CV_BGR2GRAY ); cvLaplace( gray, edge, 3 );
ShowImage( edge, IDC_ShowImg ); // 调用显示图片函数 cvReleaseImage( &gray ); cvReleaseImage( &edge );
共分享92篇相关文档