OpenCV统计米粒数目-计算联通区域的个数及联通区域内像素的个数
2013-06-04 11:01
393 查看
基于对话框的程序。
实现界面:
打开图片的消息响应函数:
图片处理的消息响应函数:
退出按钮的消息响应,重载了一下 Dialog的 OnCancel 函数:
记得在析构函数里面释放图片哦~
在 DoDataExchange 函数里面, DDX_Text(pDX, IDC_RESULT, m_result);
是将 CString 类型的m_result 将 控件 IDC_RESULT 关联起来~然后,就可以在static text 显示字符串了。。。。。
控件和变量的关联是在 DoDataExchange 中显示的 : DDX_Text(pDX, IDC_RESULT, m_result);
方法VC classwizard -- member variables 。vs 中是在控件上右击--添加变量~~~是吧
在 OnInitDialog()
中添加~
m_cvImage=new CvvImage;
m_ProcessedImage=new CvvImage;
m_hasLoadImg=false;
在OnPaint() 的
else 中添加:
【paint 函数什么时候被调用呢?当注释掉 OnBnClickedOpen() 中显示图片用的是show函数 时,没有影响~~~~
WM_PAINT消息仅用于以下两种情况:
1. 当用户移动窗口或显示窗口,或用户改变窗口的大小,或滚动窗口用户区时,Windows会向窗口函数发送WM_PAINT消息。
2. 当Windows关闭覆盖窗口部分区域的对话框时,以及菜单下拉出来又被释放时,窗口用户区被临时覆盖,系统会试图恢复显示区域,可能向窗口函数发送一条WM_PAINT消息,要求应用程序刷新其用户区。
这两种情况下将使MFC调用OnPaint处理函数。也仅有这两种情况,视图对象具有一个OnPaint处理函数。
开始点击 [打开图片] 时,算是哪种情况呢?%>_<% 】
核心代码:
int numberOfObject=cvFindContours(dst,stor,&cont,sizeof(CvContour),CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
Area=fabs(cvContourArea(cont,CV_WHOLE_SEQ));
Length=cvArcLength(cont)
圈圈的个数就是 连通区域的个数了
关于LPCTSTR转换为const char * ??
如何将LPCTSTR转换为const char * ??
项目--属性--配置属性--字符集 改为使用多字节
居然可以这么简单~~~【LPCTSTR 1、在非UNICODE环境下为 const char * 2、在UNICODE环境下为 const unsigned short * so,需要将宽字符转换为多字节】
可是,Release版本下,这个还是通不过,网上查了好多,可素,感觉乱七八糟的,谁有简单又方便的方案????
这个应该自己设计算法来实现的~~~~~哎~~~菜鸟啊菜鸟,这个才2行核心代码而已啊,赶紧学着自己写一个吧%>_<%
具体代码: http://download.csdn.net/detail/timidsmile/3671517
/article/1738169.html
实现界面:
打开图片的消息响应函数:
void CcountRiceDlg::OnBnClickedOpen() { // TODO: 在此添加控件通知处理程序代码 TCHAR szFilters[]=_T("BMP Files (*.bmp)|*.png|All Files (*.*)|*.*||"); CFileDialog dlg(TRUE,_T("All Files(*.*)"),_T("*.*"),OFN_OVERWRITEPROMPT,szFilters); if (dlg.DoModal()) { CString path=dlg.GetPathName(); int sizeOfString = (path.GetLength() + 1); LPCTSTR lpsz = new TCHAR[sizeOfString]; lpsz =(LPCTSTR)path; CRect outputRect; GetDlgItem(IDC_ORIGIN_PIC)->GetWindowRect(&outputRect); //检索指定的对话框中的控件句柄;返回指定窗口的边框矩形的尺寸 if (m_cvImage->Load(lpsz)) { m_hasLoadImg=true; m_cvImage->Show(GetDlgItem(IDC_ORIGIN_PIC)->GetDC()->GetSafeHdc(),0,0,outputRect.Width(),outputRect.Height()); } } }
图片处理的消息响应函数:
void CcountRiceDlg::OnBnClickedProcess() { // TODO: 在此添加控件通知处理程序代码 if (!m_hasLoadImg) { OnBnClickedOpen(); } CvvImage* tmp=new CvvImage; CvvImage* backImage=new CvvImage; IplConvKernel* element=cvCreateStructuringElementEx(4,4,1,1,CV_SHAPE_ELLIPSE,0);//形态学结构指针[创建结构元素,4列4行,椭圆形】 tmp->CopyOf(*m_cvImage); backImage->CopyOf(*m_cvImage); cvErode(m_cvImage->GetImage(),tmp->GetImage(),element,10);//腐蚀 cvDilate(tmp->GetImage(),backImage->GetImage(),element,10);//这里得到的backImage是背景图像 cvSub(m_cvImage->GetImage(),backImage->GetImage(),tmp->GetImage(),0);//用原始图像减去背景图像,tmp是结果图像 cvThreshold(tmp->GetImage(),backImage->GetImage(),50,255,CV_THRESH_BINARY);//这里得到的backImage是二值图 CvMemStorage* stor=cvCreateMemStorage(0); CvSeq * cont=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor); IplImage* dst; dst = cvCreateImage( cvGetSize(backImage->GetImage()), backImage->GetImage()->depth, 1 ); cvCvtColor(backImage->GetImage(), dst, CV_BGR2GRAY );//3通道->1通道 int numberOfObject=cvFindContours(dst,stor,&cont,sizeof(CvContour),CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); double maxArea=0; double tmpArea=0; CvSeq* maxAreaRice=0; double maxLength=0; double tmpLength=0; CvSeq* maxLengthRice=0; //cvThreshold(dst,dst,0,255,CV_THRESH_BINARY);//在画轮廓前先把图像变成白色 IplImage* dst_contours = cvCreateImage( cvGetSize(dst), dst->depth, dst->nChannels); cvThreshold( dst_contours, dst_contours ,0, 0, CV_THRESH_BINARY ); //在画轮廓前先把图像变成黑色。 threshold=0,pixel>0,pixel = 0. for (;cont;cont=cont->h_next) { tmpArea=fabs(cvContourArea(cont,CV_WHOLE_SEQ)); if(tmpArea>maxArea) { maxArea=tmpArea; maxAreaRice=cont; } tmpLength=cvArcLength(cont); if (tmpLength>maxLength) { maxLength=tmpLength; maxLengthRice=cont; } if (tmpArea>10) { cvDrawContours(dst_contours,cont,CV_RGB(0,0,255),CV_RGB(255,0,0),0,1,8,cvPoint(0,0));//在图像上绘制外部和内部轮廓. //【图像,第一个轮廓指针,外轮廓的颜色,内轮廓的颜色,画轮廓的最大层数(如果是0,只绘制contour),线条粗细,线条类型,按给定值移动所有点的坐标 】 } } CRect outputRect; GetDlgItem(IDC_PROCESSED_PIC)->GetWindowRect(&outputRect); m_ProcessedImage->CopyOf(dst_contours,1); CRect rect; SetRect( rect, 0, 0, outputRect.Width(),outputRect.Height() ); m_ProcessedImage->DrawToHDC(GetDlgItem(IDC_PROCESSED_PIC)->GetDC()->GetSafeHdc(),&rect); m_result.Format(_T("米粒数目为: %d 个\n米粒最大面积: %f\n米粒最大周长: %f"),numberOfObject,maxArea,maxLength); UpdateData(FALSE); cvReleaseImage(&dst); cvReleaseImage(&dst_contours); cvReleaseMemStorage(&stor); }
退出按钮的消息响应,重载了一下 Dialog的 OnCancel 函数:
void CcountRiceDlg::OnBnClickedExit() { // TODO: 在此添加控件通知处理程序代码 CDialog::OnCancel(); }
记得在析构函数里面释放图片哦~
CcountRiceDlg::~CcountRiceDlg() { if (m_cvImage) { delete m_cvImage; } if (m_ProcessedImage) { delete m_ProcessedImage; } }
在 DoDataExchange 函数里面, DDX_Text(pDX, IDC_RESULT, m_result);
是将 CString 类型的m_result 将 控件 IDC_RESULT 关联起来~然后,就可以在static text 显示字符串了。。。。。
控件和变量的关联是在 DoDataExchange 中显示的 : DDX_Text(pDX, IDC_RESULT, m_result);
方法VC classwizard -- member variables 。vs 中是在控件上右击--添加变量~~~是吧
在 OnInitDialog()
中添加~
m_cvImage=new CvvImage;
m_ProcessedImage=new CvvImage;
m_hasLoadImg=false;
在OnPaint() 的
else 中添加:
CDialog::OnPaint(); CRect outputRect; GetDlgItem(IDC_PROCESSED_PIC)->GetWindowRect(&outputRect); m_ProcessedImage->Show(GetDlgItem(IDC_PROCESSED_PIC)->GetDC()->GetSafeHdc(),0,0,outputRect.Width(),outputRect.Height()); GetDlgItem(IDC_ORIGIN_PIC)->GetWindowRect(&outputRect); CRect rect; SetRect( rect, 0, 0, outputRect.Width(),outputRect.Height() ); m_cvImage->DrawToHDC(GetDlgItem(IDC_ORIGIN_PIC)->GetDC()->GetSafeHdc(),&rect);
【paint 函数什么时候被调用呢?当注释掉 OnBnClickedOpen() 中显示图片用的是show函数 时,没有影响~~~~
WM_PAINT消息仅用于以下两种情况:
1. 当用户移动窗口或显示窗口,或用户改变窗口的大小,或滚动窗口用户区时,Windows会向窗口函数发送WM_PAINT消息。
2. 当Windows关闭覆盖窗口部分区域的对话框时,以及菜单下拉出来又被释放时,窗口用户区被临时覆盖,系统会试图恢复显示区域,可能向窗口函数发送一条WM_PAINT消息,要求应用程序刷新其用户区。
这两种情况下将使MFC调用OnPaint处理函数。也仅有这两种情况,视图对象具有一个OnPaint处理函数。
开始点击 [打开图片] 时,算是哪种情况呢?%>_<% 】
核心代码:
int numberOfObject=cvFindContours(dst,stor,&cont,sizeof(CvContour),CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
Area=fabs(cvContourArea(cont,CV_WHOLE_SEQ));
Length=cvArcLength(cont)
圈圈的个数就是 连通区域的个数了
关于LPCTSTR转换为const char * ??
如何将LPCTSTR转换为const char * ??
项目--属性--配置属性--字符集 改为使用多字节
居然可以这么简单~~~【LPCTSTR 1、在非UNICODE环境下为 const char * 2、在UNICODE环境下为 const unsigned short * so,需要将宽字符转换为多字节】
可是,Release版本下,这个还是通不过,网上查了好多,可素,感觉乱七八糟的,谁有简单又方便的方案????
这个应该自己设计算法来实现的~~~~~哎~~~菜鸟啊菜鸟,这个才2行核心代码而已啊,赶紧学着自己写一个吧%>_<%
具体代码: http://download.csdn.net/detail/timidsmile/3671517
/article/1738169.html
相关文章推荐
- OpenCV统计米粒数目-计算联通区域的个数及联通区域内像素的个数
- OpenCV统计米粒数目-计算联通区域的个数及联通区域内像素的个数
- VS+++opencv++MFC++数米粒【计算联通区域的个数及联通区域内像素的个数】
- opencv之7.6计算联通区域的形状描述
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV 鼠标响应函数 ,用鼠标选中一块图像区域,然后计算选中的ROI区域的统计直方图
- OpenCV计算连通区域数目与最大连通区域并标示出
- VS+++opencv++MFC++数米粒【计算联通区域的个数及联通区域内像素的个数】
- OpenCV计算连通区域数目与最大连通区域并标示出
- 【opencv】统计图像二值化后白色像素点个数
- OpenCV2编程手册笔记之 7.6计算连通区域的形状描述符
- opencv 二值化图像 像素统计 countNonZero
- 【Python+OpenCV】图片局部区域像素值处理
- 【opencv学习记录】以迭代器方式访问图像像素,统计像素信息存入文件
- opencv访问图片中像素的方法(三)——动态地址计算