基于OpenCV细胞识别计数

来源:互联网 发布:mysql没有配置文件 编辑:程序博客网 时间:2024/04/29 05:36

OpenCV提供了充分的对外接口,可以方便的进行图像识别

用到的函数有 cvSmooth ();,图像过滤,这里用到的是高斯平滑

void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3, int param2=0, double param3=0 ,double param4=0);src:输入图像.

dst:输出图像.

smoothtype:平滑方法 这里用高斯平滑,效果最好


cvDilate();对图像进行膨胀处理,常用于处理相似图形识别

void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

src输入图像.dst输出图像.

element结构元素。若为 NULL, 则使用默认的3×3 长方形,锚点在中间的结构元素,进行膨胀运算

iterations膨胀的次数

CvSeq *cvHoughCircles() 霍夫图形识别算法 其实依旧是canny识别的应用- -

CvSeq *cvHoughCircles(CvArr *image,void *circle_storage,int method,double dp,double min_dist,double param1,double param2,int min_radius,int max_radius)

image:输入8bit(灰度)图像,其内容可被函数所改变

circle_storage:检测到的圆存储仓,可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的CV_32FC3型矩阵(CvMat*). 矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的圆。如果 circle_storage 是矩阵,而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回,每个圆由三个浮点数表示:圆心坐标(x,y)和半径.).

method:Hough 变换方式,目前只支持CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].

dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。

min_dist:该参数是让算法能明显区分的两个不同圆之间的最小距离。

param1:用于Canny的边缘阀值上限,下限被置为上限的一半。

param2:累加器的阀值。The second method-specific parameter. In case of CV_HOUGH_GRADIENT it is accumulator threshold at the center detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first.

min_radius:最小圆半径。

max_radius:最大圆半径。

其中阈值需要好好设定,这里设定21  在中心点扫描阶段 命中次数 小于21为0大于21为1 过小会造成识别错误 造成错误点


源代码:

IplImage* Img = cvLoadImage( "2.tif" );//函数原型是 cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
cvSmooth( Img, Img, CV_GAUSSIAN, 3, 3);
cvDilate(Img,Img,0,2); 

IplImage* Gray = cvCreateImage( cvGetSize(Img), 8, 1 ); //创建一个副本 “gray” 
CvMemStorage* storage = cvCreateMemStorage(0); //创建一个内存存储器 
cvCvtColor( Img, Gray, CV_BGR2GRAY ); //使用cvCvtColor命令,得到灰度图 
cvSmooth( Gray, Gray, CV_GAUSSIAN, 3, 3); //高斯平滑 
CvSeq* circles = cvHoughCircles( Gray, storage, CV_HOUGH_GRADIENT, 1, 4, 3.5,21,2,15 ); //当第4个参数设为2时分辨率变为原来的一半 
CString a1;
a1.Format(_T("%d"),circles->total);
CStdioFile SFile;
if(SFile.Open(_T("C:\\OK.TXT"), CFile::modeCreate| CFile::modeReadWrite ))
SFile.WriteString(a1);
SFile.Close();
int i; 
for( i = 0; i < circles->total; i++ ) //画出圆轨迹,找圆的工作已在上一个命令中完成
{ float* p = (float*)cvGetSeqElem( circles, i ); 
cvCircle( Img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 ); 
cvCircle( Img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 ); //画圆,x = p[0], y = p[1], r = p[2],Img的内容被cvCircle函数改变

//cvNamedWindow( "circles", 1 );
//cvShowImage( "circles", Gray ); 
cvNamedWindow( "circles", 1 ); 
cvShowImage( "circles", Img ); 
while( 1 ) if( cvWaitKey( 0 ) == 27 ) 
break; //release the memory 
cvDestroyWindow( "circles" ); 
cvClearMemStorage( storage ); 
cvReleaseImage( &Img );



效果图, 检测细胞的图片 效果一般。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米4卡死了怎么办啊 苹果平板电脑开不了机怎么办 ipad开不了机怎么办都是黑屏 手机突然黑屏了死机状态怎么办 苹果平板死机不能重启怎么办 韩众平板死机了怎么办 苹果平板输入密码多次停用怎么办 ld密码被停用了怎么办 档案被自己丢了怎么办 手机在厂里丢了怎么办 在厂里借工具丢了怎么办 导出的考勤没有姓名怎么办 退休时档案丢了怎么办 职工与企业没有劳资怎么办 去大学报道的档案袋丢失怎么办 档案入学毕业年份写错怎么办 从事业单位辞职后人事档案怎么办 老师辞职不给批怎么办 公办教师去私立学校档案怎么办 辞职后档案不给怎么办 档案不小心拆了怎么办 退休职工档案年龄有涂改怎么办 养老金原始档案找不到怎么办退休 寄辞职信不接收怎么办 公司不给办离职怎么办 离职手续表填写错误怎么办 退货少退了个配件怎么办 小米8拖影严重怎么办 被兼职中介骗了怎么办 被兼职中介坑了怎么办 人在工厂宿舍死了怎么办 事业单位在编人员开除后社保怎么办 因违规无法进群怎么办 微信号违规进不了群怎么办 工作跨省调动社保怎么办 工作中看到别人违反规定应该怎么办 深户调令过期了怎么办 特岗教师满三年怎么办 特岗教师想辞职怎么办 入职一周想离职怎么办 原单位买断工龄后档案怎么办