`
Fangrn
  • 浏览: 818445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

opencv 查找矩形

    博客分类:
  • vc++
 
阅读更多

opencv 查找矩形

//矩形查找
BOOL CImageFun::FindSquares(IplImage *srcImage, double fMaxR, double fMinR, ARRCIR_XY_R &ptarr, int npar1, int npar2)
{
	CvSeq *contour;   
	int header_size, i, count;
	CvPoint *PointArray;   
	CvPoint2D32f *PointArray32f;   
	CvPoint myCenter;   
	CvBox2D *myBox = (CvBox2D *) malloc(sizeof(CvBox2D));  //用于画圆和椭圆,这里将是 方形边缘周长拟合的圆
	header_size = sizeof(CvContour);
	IplImage* gray = Canny(srcImage,npar1,npar2);

	IplImage *dst_=cvCloneImage( srcImage );

	CvMemStorage* storage = cvCreateMemStorage(0);
	int number_of_c=cvFindContours (gray , storage, &contour, header_size, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
	// 检查所有的轮廓    
	while(contour!=NULL) //当轮廓contour不为空时
	{   
		if(CV_IS_SEQ_CURVE(contour))   
		{   
			count = contour ->total;//序列元素的总数,即轮廓上点的总数    
			PointArray = (CvPoint *)malloc(count * sizeof(CvPoint));   
			cvCvtSeqToArray(contour, PointArray, CV_WHOLE_SEQ);   
			PointArray32f = (CvPoint2D32f *) malloc((count + 1) * sizeof(CvPoint2D32f));   
			ARRPOINT arr;
			POINT pt;
			for (i=0; i<count-1; i++)   
			{                                 
				pt.x = PointArray32f[i].x = (double)(PointArray[i].x);   
				pt.y = PointArray32f[i].y = (double)(PointArray[i].y);   
				arr.push_back(pt);
			}
			PointArray32f[i].x = (double)(PointArray[0].x);   
			PointArray32f[i].y = (double)(PointArray[0].y);        

			if (count>=7)   
			{     
				cvFitEllipse(PointArray32f, count,myBox);   
				myCenter.x = (int) myBox->center.x;   
				myCenter.y = (int) myBox->center.y;   
				double length  = myBox->size.height / 2;
				double width   = myBox->size.width  / 2;

				BOOL bOk =(myCenter.x > 0) && (myCenter.y >0);
				bOk &= myCenter.x - length >=0;
				bOk &= myCenter.x + length <= srcImage->width;
				bOk &= myCenter.y - length >=0;
				bOk &= myCenter.y + length <= srcImage->height;
				bOk &= length >= fMinR && length <= fMaxR;
				////////////////////////
				//过滤,半径过大的,过小的,丢弃
				if (!bOk)
				{
					goto EXIT_END;
				}

				cvCircle( dst_, cvPoint(cvRound(myCenter.x),cvRound(myCenter.y)), 3, CV_RGB(0,255,0), -1, 8, 0 );
				cvCircle( dst_, cvPoint(cvRound(myCenter.x),cvRound(myCenter.y)), cvRound(myBox->size.height / 2), CV_RGB(255,0,0), 1, 8, 0 );
				//DBWindowWrite(_T("圆心坐标x= %d 圆心坐标y=%d 半径=%.3f"),myCenter.x,myCenter.y,length);

				/////////////简单的将找到的位置信息加到集合中////////////
				CIR_XY_R ptcyr = {myCenter.x, myCenter.y,length};
				ptarr.push_back(ptcyr);
				/*//创建一个矩形,然后
				POINT ptcr;
				ptcr.x = myCenter.x;
				ptcr.y = myCenter.y;
				ARRPOINT::iterator iter;
				for (iter = arr.begin(); iter != arr.end(); iter++)
				{
				float fdis = GetPointDistance(ptcr,*iter);
				DBWindowWrite(_T("坐标x=%d 坐标y= %d"),(*iter).x,(*iter).y);
				}
				bOk &= abs(length - width) <= nMarkPixOffset;
				if(bOk)          //检测所有的点是否在圆上,容许的10的数据误差,误差+-2个像素
				{  
					POINT ptcr;
					ptcr.x = myCenter.x;
					ptcr.y = myCenter.y;
					int nOut =0;
					ARRPOINT::iterator iter;
					for (iter = arr.begin(); iter != arr.end(); iter++)
					{
						float fdis = GetPointDistance(ptcr,*iter);
						if(abs(fdis - length) <= nMarkPixOffset) nOut++;
					}

					CIR_XY_R ptcyr = {myCenter.x, myCenter.y,length};
					float fbl = (float)nOut / arr.size();
					if(fbl >= fMarkTolerance)  ptarr.push_back(ptcyr); //找到了就直接跳出来
				}*/
			}   
EXIT_END:
			free(PointArray32f );   
			free(PointArray );   
			if(ptarr.size()) break;
		}   
		contour = contour->h_next;   
	}   
	//cvShowImage( "template", dst_ ); 
	//cvWaitKey( 0 );
 
	free (myBox);               
	cvReleaseImage(&gray);
	cvReleaseImage(&dst_);
	cvReleaseMemStorage(&storage);   
	//过滤集合数据
	if (FALSE){
		double dx=0,dy=0,dr=0;
		for (int i=0;i<ptarr.size();i++)
		{
			dx+=ptarr[i].fx;
			dy+=ptarr[i].fy;
			dr+=ptarr[i].fr;
		}
		ptarr.clear();
		CIR_XY_R ptcyr = {dx/ptarr.size(), dy/ptarr.size(), dr/ptarr.size()};
		ptarr.push_back(ptcyr);
	}
	return ptarr.size();
}
 
分享到:
评论

相关推荐

    opencv求取外接矩形

    "OpenCV外接矩形求解算法" OpenCV是一款功能强大且广泛应用的计算机视觉库,它提供了大量的函数和算法来处理图像和视频数据。在本文中,我们将介绍如何使用OpenCV来实现外接矩形的求解算法。 OpenCV中的轮廓 在...

    OpenCV查找轮廓

    OpenCV轮廓查找 OpenCV是一种计算机视觉库,它提供了许多功能强大的图像处理功能,其中包括查找和解析指定轮廓的能力。...使用OpenCV查找轮廓可以帮助我们快速地获取图像中的轮廓信息,并对其进行进一步的处理和分析。

    【OpenCv基础】第三十七讲 基础轮廓查找

    在OpenCV库中,轮廓查找是一项非常重要的计算机视觉技术,尤其在图像处理和分析领域。这一讲我们将深入探讨“基础轮廓查找”的概念及其在OpenCV中的实现,涉及到的知识点包括轮廓的基本概念、查找方法以及如何在不同...

    OpenCV速查表(C++)

    - Rect:用于定义矩形区域。 - Range:用于定义范围,可以是整数或浮点数范围。 - Mat:用于存储矩阵、图像、特征描述符、体素直方图等。 2. **创建和初始化矩阵**: - 使用`Mat::zeros`和`Mat::ones`可以分别...

    利用OpenCV和Python实现查找图片差异

    本文将介绍如何使用OpenCV和Python来查找两张图片的差异,主要介绍两种方法:均方误差(Mean Squared Error, MSE)算法和结构相似性指数(Structural Similarity Index Measurement, SSIM)算法。 均方误差算法是一...

    使用OpenCV检测图像中的矩形

    使用OpenCV检测图像中的矩形 OpenCV是一个功能强大的计算机视觉库,提供了许多实用的函数和类来处理图像。其中,检测图像中的矩形是一种常见的图像处理任务,本文将详细介绍使用OpenCV来检测图像中的矩形。 矩形...

    OpenCV文字区域定位

    先通过`pytesseract.image_to_boxes()`或`image_to_string()`函数获取候选区域的文字信息,然后利用OpenCV的矩形或其他形状函数来描绘出文字的位置。 5. **优化与应用**:为了提高检测性能,可以使用深度学习模型,...

    openCV提取图像中的矩形区域

    在OpenCV中,提取图像中的矩形区域是一个常见的任务,特别是在图像处理和计算机视觉领域。以下将详细解释如何实现这个过程,以及代码中涉及的关键步骤。 首先,我们需要导入必要的库,如`numpy`和`opencv-python`...

    Python Opencv实现图像轮廓识别功能

    Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。 import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2....

    opencv人脸/人眼/人体识别分类器

    该函数接受输入图像、缩放因子、最小和最大检测窗口大小等参数,返回一个矩形框的列表,表示检测到的对象位置。 **优化与性能**: 尽管Haar级联分类器在许多情况下表现良好,但其速度和精度可能会受到图像尺寸、...

    OpenCV实现查找和绘制图片轮廓矩(C++实现).zip

    本项目以“OpenCV实现查找和绘制图片轮廓矩(C++实现)”为主题,主要关注如何使用OpenCV库在C++环境中查找并绘制图像的轮廓,以及计算这些轮廓的矩形特征。以下将详细阐述相关知识点。 1. **OpenCV库介绍** ...

    Opencv课程作业及其项目, 生长算法,均值处理,MASK掩码,直方图及开闭运算,查找轮廓及其外矩形

    1、资源内容:Opencv课程作业及其项目, 生长算法,均值处理,MASK掩码,直方图及开闭运算,查找轮廓及其外矩形 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释...

    opencv2检测图片中的矩形

    (1)实现了矩形的检测(2)此代码是针对图片中的矩形进行的(3)此代码实现了一个文件夹里的图片的批量处理

    Python-opencv-植物叶片识别

    * 在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色。 查找轮廓 函数 cv2.findContours() 有三个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是...

    opencv 查找连通区域 最大面积实例

    在OpenCV中,查找连通区域是图像处理中的一个重要任务,常用于识别图像中的特定对象或区域。这个实例主要展示了如何利用OpenCV找到图像中的最大连通区域并计算其面积。首先,我们需要了解几个关键的概念和函数。 1....

    OpenCV Tutorials.pdf (2.4.7)

    - **图像扫描、查找表和时间测量**:讲解了如何利用OpenCV进行图像扫描、查找表操作和时间测量。 - **矩阵的掩码操作**:如何在矩阵上进行掩码操作。 - **图像融合**:使用OpenCV合并两张图片的方法。 - **离散...

    opencv 入门学习官方文档

    除了基础的图像加载和显示操作,文档还涉及了更深层次的图像处理技术,比如如何通过OpenCV扫描图像、使用查找表进行快速图像操作、对矩阵进行掩码操作等。其中,掩码操作是数字图像处理中常用的技术之一,可以帮助...

    openCV 车别识别

    通过轮廓查找和面积筛选,可以找到最有可能是车牌的区域。 接下来是关键的字符分割阶段。OpenCV中的连通组件分析可以帮助识别出单个字符,然后根据字符的形状和大小进行分类。这一步可能需要训练一个机器学习模型,...

    opencv_tutorial_2.4.10

    这部分介绍了如何使用OpenCV查找图像中的轮廓,这是图像分割和目标检测中的一个关键步骤。 **3.21 凸包** 这部分讨论了凸包的概念及其在图像处理中的应用,如对象轮廓的简化表示。 **3.22 为轮廓创建边界框和圆形**...

    基于OpenCV的图像轮廓提取实现

    总的来说,基于OpenCV的图像轮廓提取涉及到图像预处理、边缘检测、轮廓查找与绘制等多个环节。通过动态参数调节,我们可以灵活地控制提取结果,以满足不同的应用场景需求。掌握这一技术对于进行物体检测、形状识别...

Global site tag (gtag.js) - Google Analytics