#include "stdafx.h"
// FitCircle.cpp : 定义控制台应用程序的入口 #include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "cvaux.h"
#include <iostream> using namespace cv;
using namespace std;
void main()
{ int BasicGlobalThreshold(int*pg,int start,int end);
CvBox2D findRectContours(IplImage *src);
IplImage* imgGrey=cvLoadImage("5_000004.bmp",);
//IplImage* imgGrey=cvLoadImage("28027.jpg",0);
cvNamedWindow("原始图像");
//cvShowImage("fa",imgGrey);
cvShowImage("原始图像",imgGrey);
double t=(double)getTickCount(); IplImage* imgBasicGlobalThreshold = cvCreateImage(cvGetSize(imgGrey),IPL_DEPTH_8U,);
cvCopyImage(imgGrey,imgBasicGlobalThreshold);
int pg[],i,thre;
for (i=;i<;i++) pg[i]=;
for (i=;i<imgBasicGlobalThreshold->imageSize;i++) // 直方图统计
pg[(BYTE)imgBasicGlobalThreshold->imageData[i]]++;
thre = BasicGlobalThreshold(pg,,); // 确定阈值
cout<<"The Threshold of this Image in BasicGlobalThreshold is:"<<thre<<endl;//输出显示阀值 cvThreshold(imgBasicGlobalThreshold,imgBasicGlobalThreshold,thre,,CV_THRESH_BINARY); // 二值化
cvNamedWindow("二值图像");
cvShowImage("二值图像",imgBasicGlobalThreshold);
CvBox2D box=findRectContours(imgBasicGlobalThreshold);
t=((double)getTickCount()-t)/getTickFrequency();
cout<<t<<" mark点坐标"<<box.center.x<<"\t"<<box.center.y<<endl<<"半径"<<box.size.width<<endl; cvWaitKey(); } CvBox2D findRectContours(IplImage *src)
{
CvBox2D box1;
IplImage* des=cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
cvZero(des); CvMemStorage* memory=cvCreateMemStorage();
CvSeq* Icontour=NULL;
CvSeq* maxContour =NULL; cvShowImage("原始图像1",src);
cvFindContours(src,memory,&Icontour, sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(,));
double area=;
double maxArea=; while(Icontour)
{
area=fabs(cvContourArea(Icontour,CV_WHOLE_SEQ));
//cout<<area<<endl;
//cvDrawContours(src, Icontour,
// CV_RGB(255,255,255), CV_RGB(255, 255,255),
// 0, 1, 8, cvPoint(0,0));
//
if(area> && area<)
{
goto l1; }
else
goto l2;
l1: CvBox2D box0=cvFitEllipse2(Icontour);
float a=(float)box0.size.height/(float)box0.size.width;
//cout<<area<<endl;
if(fabs(a)<=1.5)
{
cvDrawContours(des, Icontour,
CV_RGB(,,), CV_RGB(, ,), , , , cvPoint(,));
box1=box0; cvDrawCircle(des,cvPoint(box0.center.x,box0.center.y),,cvScalar(,,),,,);
//cvDrawContours(des,maxContour,cvScalar(0,0,255),cvScalar(0,0,255),1,1,0,cvPoint(0,0)); }
// maxContour = Icontour; l2: Icontour =Icontour->h_next;
}
cvShowImage("fds",des); return box1; }
/*============================================================================
= 代码内容:基本全局阈值法 迭代法
==============================================================================*/
int BasicGlobalThreshold(int*pg,int start,int end)
{ // 基本全局阈值法 int i,t,t1,t2,k1,k2;
double u,u1,u2;
t=;
u=;
for (i=start;i<end;i++)
{
t+=pg[i];
u+=i*pg[i];
}
k2=(int) (u/t); // 计算此范围灰度的平均值
do
{
k1=k2;
t1=;
u1=;
for (i=start;i<=k1;i++)
{ // 计算低灰度组的累加和
t1+=pg[i];
u1+=i*pg[i];
}
t2=t-t1;
u2=u-u1;
if (t1)
u1=u1/t1; // 计算低灰度组的平均值
else
u1=;
if (t2)
u2=u2/t2; // 计算高灰度组的平均值
else
u2=;
k2=(int) ((u1+u2)/); // 得到新的阈值估计值
}
while(k1!=k2); // 数据未稳定,继续
//cout<<"The Threshold of this Image in BasicGlobalThreshold is:"<<k1<<endl;
return(k1); // 返回阈值
}

opencv——pcb上寻找mark点(拟合椭圆的方法)的更多相关文章

  1. opencv——pcb上找圆mark点(模板匹配)

    #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <cxcore.h ...

  2. opencv —— minEnclosingCircle、fitEllipse 寻找包裹轮廓的最小圆、点集拟合椭圆

    寻找包裹轮廓的最小圆:minEnclosingCircle 函数 返回圆应满足:① 轮廓上的点均在圆形空间内.② 没有面积更小的满足条件的圆. void minEnclosingCircle(Inpu ...

  3. PCB上过孔via钻孔的直径如何设置 是任意的吗 谈谈PCB钻孔工艺及规格

    PCB上过孔via钻孔的直径如何设置,是不是可以随便填入一个直径尺寸就行了?比如我的走线宽度是6mil,那我的via过孔直径也设置为6mil,节约布线空间岂不是更好?这样的设计板厂是否都能按照设计规格 ...

  4. 【opencv入门篇】 10个程序快速上手opencv【上】

    导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...

  5. PCB上 如何显示 汉字

    原理图上有汉字,那如何在PCB上显示汉子呢  ?  而不至于显示乱码 按如下操作  ,双击乱码  ,进入设置模式 设置好后,显示的字体样式.

  6. PCB genesis短槽加引导孔实现方法

    一.何为短槽 短槽通常定义:槽长小于2倍槽宽      如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...

  7. PHP实现上传文件并存进数据库的方法

    本文实例讲述了PHP实现上传文件并存进数据库的方法.分享给大家供大家参考.具体如下: show_add.php文件如下: <?php if(!isset($_REQUEST[''id'']) o ...

  8. 一种基于重载的高效c#上图片添加文字图形图片的方法

    在做图片监控显示的时候,需要在图片上添加文字,如果用graphics类绘制图片上的字体,实现图像上添加自定义标记,这种方法经验证是可行的,并且在visual c#2005 编程技巧大全上有提到,但是, ...

  9. 将本地文件上传到指定的服务器(HttpWebRequest方法)

    将本地文件上传到指定的服务器(HttpWebRequest方法),通过文件流,带文件名,同文件一同上传的表单文本域及值. ///<summary> /// 将本地文件上传到指定的服务器(H ...

随机推荐

  1. 在ubuntu中添加新硬盘

    在ubuntu中添加新硬盘 转载于 http://www.cnblogs.com/unipower/archive/2009/03/08/1406230.html  前言 安装新硬盘这种事情并不会经常 ...

  2. 第四章:重构代码[学习Android Studio汉化教程]

    第四章 Refactoring Code The solutions you develop in Android Studio will not always follow a straight p ...

  3. postman 中url有动态变换的值时,可以按下面方式变换。

    get 和post均适用.

  4. wwwroot文件无读取某个文件夹权限(对IIS_USER增加全部权限)

  5. Oracle11gR2导入导出实战之物化视图prebuilt

    源实例上创建表 物化视图 oracle@localhost admin]$ sqlplus system/oracle@orcl2 SQL*Plus: Release 11.2.0.4.0 Produ ...

  6. ATL接口返回类型&&ATL接口返回字符串BSTR*

    感觉在ATL中做COM组件,添加方法的时候,其返回值只能是HRESULT,我想返回其他数据类型,可以吗? 非也非也 HRESULT指示返回的状态,即正确与否, 返回值是这样的 HRESULT MyMe ...

  7. <转>linux操作系统编程——共享内存读写(采用信号量进行同步互斥)

    http://blog.csdn.net/yanghaoran321/article/details/7872722 程序要求: 创建一个写端和一个读端,写端写入数据后读端才开始读,读端读完数据后,写 ...

  8. powerdesigner 数据库表定义导出到excel

    shift+ctrl+X,打开脚本运行,脚本如下:'************************************************************************** ...

  9. Django创建一个简单的blog

    1. 使用django-admin.py 创建mysite项目 sunny@sunny-ThinkPad-T450:~/PycharmProjects$ django-admin.py startpr ...

  10. jenkins-为什么要持续集成

    持续集成(Continuous Integration),也就是我们经常说的 CI,是现代软件开发技术的基础.本文论述了当前软件开发过程中存在的问题,讲解了持续集成.持续集成服务器的概念,最终探讨了为 ...