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-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。 import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2....
(1)实现了矩形的检测(2)此代码是针对图片中的矩形进行的(3)此代码实现了一个文件夹里的图片的批量处理
这段时间一直在用opencv搞图像处理的问题,发现虽然可调用的函数多,但是直接找相应代码还是很困难,就行寻找连通域,并在连通域外侧加框,对于习惯使用Mat矩形操作的我,真心感觉代码少之又少,为防止以后自己还会...
1、资源内容:Opencv课程作业及其项目, 生长算法,均值处理,MASK掩码,直方图及开闭运算,查找轮廓及其外矩形 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释...
73 创建包围轮廓的矩形边界 8.3.6 74 创建包围轮廓的圆形边界 8.3.7 示例程序序号 程序说明 对应章节 75 使用多边形包围轮廓 8.3.8 76 图像轮廓矩 8.4.4 77 分水岭算法的使用 8.5.2 78 实现图像修补 8.6.2 79 H-S二...
本文实例为大家分享了OpenCV识别提取图像中的水平线与垂直线,供大家参考,具体内容如下 1).原理 图像形态学操作时候,可以通过自定义的结构元素实现结构元素 对输入图像一些对象敏感、另外一些对象不敏感,这样就...
6.2 画矩形 6.3 画圆 6.4 画椭圆 6.5 画多边形 6.6 在图片上添加文字 7 把鼠标当画笔 7.1 简单演示 7.2 高级一点的示例 8 用滑动条做调色板 8.1 代码示例 III 核心操作 9 图像的基础操作 9.1 获取并修改像素...
句法 基本的图像过滤器使⽤的函数 将图像转为灰度图像 将图像转为HSV 图像模糊 边缘检测 膨胀 腐蚀 绘制不同的形状 矩形: 圆: 线: 在图像上书写⽂字 检测并裁剪脸部 参考⽂献 OpenCV OpenCV是计算机视觉中最受...
如下所示: def draw_circle(event,x,y,flags,param): global ix,iy,drawing,mode,start_x,start_y if event == cv2.EVENT_LBUTTONDOWN: if drawing == False: start_x, start_y = x,y ix,iy = x,y ...
它执行一些基本操作,例如查找图像的形状,名称等,然后将数据写入excel文件。 videoprocessing.py-从图像中捕获帧,并删除其中的蓝色和绿色分量。 facedetect.py-在图像中检测到的脸部周围创建一个矩形。
设计过程中对于车牌部分的矩形的识别,出现识别错误区域的问题,通过查找网上的相关案例设定好判断条件以及和周围相同题目的同学请教其如何识别出车牌区域得以解决。通过此次综合项目练习,让我对以往的知识点的运用...
接下来,我们通常需要做的是拟合这些边缘的前景,如拟合出包含前景或者边缘像素点的最小外包矩形、圆、凸包等几何形状,为计算它们的面积或者模板匹配等操作打下坚实的基础。 一、查找、绘制轮廓 首先了解一下轮廓...
比例尺是矩形用户选择中最长的连接组件 在现实生活中,刻度始终等于1毫米 图像类似于particle1.png (显微镜下的粒子) 调试 选择并按“完成”后,比例尺将在原始图像中以红色突出显示。 再次检查程序认为比例尺的确...
经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用。本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试。 原图为: 2、测试代码: import cv2 import numpy as np img = cv2.imread('/home...
光流跟踪----Python+OpenCV 这是一个演示视频流中对象跟踪的小程序。 Lucas Kanade 光流算法用于查找从一帧到另一帧的像素。 @Usage:通过在命令行中键入以下命令来运行程序:$ python tracking6.py 该程序将连接...
基于Halcon平台实现通过卡尺寻找边缘点,通过最小二乘法拟合直线
基于opencv的颜色识别,在摄像头(笔记本自带摄像头)采集到的视频上用矩形轮廓圈出查找到的红色区域或者红色物体
EEE508项目 这是EEE508数字图像处理的第二个课程项目。 目标 此android APP是为对象检测...查找彼此之间距离最小的比赛 转移匹配点以指向彩色图像 绘制边界匹配的矩形 创建输出图像 这些的实现主要可以在以下位置找到:
用法:最小面积最小面积矩形或定向的最小边界框,是查找包含所有点的矩形; 使用opencv中的代码。vector<Point> pts;MinAreaRect res = RotatingCalipers::minAreaRect(its);最小面积struct MinAreaRect{ double ...
③轮廓查找(也可以根据矩检测跟踪) ④外接矩形获取 ⑤位置标定 #include #include using namespace cv; using namespace std; void detectROI(Mat& mask, Rect& rect);//获取轮廓 与 绘制矩形 Rect rect; int main...