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中的实现,涉及到的知识点包括轮廓的基本概念、查找方法以及如何在不同...
- Rect:用于定义矩形区域。 - Range:用于定义范围,可以是整数或浮点数范围。 - Mat:用于存储矩阵、图像、特征描述符、体素直方图等。 2. **创建和初始化矩阵**: - 使用`Mat::zeros`和`Mat::ones`可以分别...
本文将介绍如何使用OpenCV和Python来查找两张图片的差异,主要介绍两种方法:均方误差(Mean Squared Error, MSE)算法和结构相似性指数(Structural Similarity Index Measurement, SSIM)算法。 均方误差算法是一...
使用OpenCV检测图像中的矩形 OpenCV是一个功能强大的计算机视觉库,提供了许多实用的函数和类来处理图像。其中,检测图像中的矩形是一种常见的图像处理任务,本文将详细介绍使用OpenCV来检测图像中的矩形。 矩形...
先通过`pytesseract.image_to_boxes()`或`image_to_string()`函数获取候选区域的文字信息,然后利用OpenCV的矩形或其他形状函数来描绘出文字的位置。 5. **优化与应用**:为了提高检测性能,可以使用深度学习模型,...
在OpenCV中,提取图像中的矩形区域是一个常见的任务,特别是在图像处理和计算机视觉领域。以下将详细解释如何实现这个过程,以及代码中涉及的关键步骤。 首先,我们需要导入必要的库,如`numpy`和`opencv-python`...
Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。 import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2....
该函数接受输入图像、缩放因子、最小和最大检测窗口大小等参数,返回一个矩形框的列表,表示检测到的对象位置。 **优化与性能**: 尽管Haar级联分类器在许多情况下表现良好,但其速度和精度可能会受到图像尺寸、...
本项目以“OpenCV实现查找和绘制图片轮廓矩(C++实现)”为主题,主要关注如何使用OpenCV库在C++环境中查找并绘制图像的轮廓,以及计算这些轮廓的矩形特征。以下将详细阐述相关知识点。 1. **OpenCV库介绍** ...
1、资源内容:Opencv课程作业及其项目, 生长算法,均值处理,MASK掩码,直方图及开闭运算,查找轮廓及其外矩形 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释...
(1)实现了矩形的检测(2)此代码是针对图片中的矩形进行的(3)此代码实现了一个文件夹里的图片的批量处理
* 在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色。 查找轮廓 函数 cv2.findContours() 有三个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是...
在OpenCV中,查找连通区域是图像处理中的一个重要任务,常用于识别图像中的特定对象或区域。这个实例主要展示了如何利用OpenCV找到图像中的最大连通区域并计算其面积。首先,我们需要了解几个关键的概念和函数。 1....
- **图像扫描、查找表和时间测量**:讲解了如何利用OpenCV进行图像扫描、查找表操作和时间测量。 - **矩阵的掩码操作**:如何在矩阵上进行掩码操作。 - **图像融合**:使用OpenCV合并两张图片的方法。 - **离散...
除了基础的图像加载和显示操作,文档还涉及了更深层次的图像处理技术,比如如何通过OpenCV扫描图像、使用查找表进行快速图像操作、对矩阵进行掩码操作等。其中,掩码操作是数字图像处理中常用的技术之一,可以帮助...
通过轮廓查找和面积筛选,可以找到最有可能是车牌的区域。 接下来是关键的字符分割阶段。OpenCV中的连通组件分析可以帮助识别出单个字符,然后根据字符的形状和大小进行分类。这一步可能需要训练一个机器学习模型,...
这部分介绍了如何使用OpenCV查找图像中的轮廓,这是图像分割和目标检测中的一个关键步骤。 **3.21 凸包** 这部分讨论了凸包的概念及其在图像处理中的应用,如对象轮廓的简化表示。 **3.22 为轮廓创建边界框和圆形**...
总的来说,基于OpenCV的图像轮廓提取涉及到图像预处理、边缘检测、轮廓查找与绘制等多个环节。通过动态参数调节,我们可以灵活地控制提取结果,以满足不同的应用场景需求。掌握这一技术对于进行物体检测、形状识别...