#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. 【MySQL】教程及常用工具和操作

    12.MySQL菜鸟教程 http://www.runoob.com/mysql/mysql-data-types.html 3.MySQL Workbench怎么使用及其使用教程 https://j ...

  2. ubuntu时区设置

    local-gen zh_CN.UTF-8 UTF-8 /var/lib/locales/supported.d/local可以看到如下内容: zh_CN.UTF-8 UTF-8 en_US.UTF- ...

  3. RHCE7 学习里程-2.telnet 服务配置

    一.安装telnet 服务 1.yum install -y telnet-server 2.yum install -y xinetd 安装两个包 将两个服务做成开机启动 1.systemctl e ...

  4. Markdown之表格的处理

    目前编辑器不支持表格,以往是通过截图,呈现的效果并不好,Markdown支持html,所以我们可以用html来写表格.但是......用html写表格,实在太麻烦了,这里有个简单的转换方法,供大家参考 ...

  5. 搭建Git Server - 个人开发简单搭建

    ###################### 教程一 ####################### 1. 创建git用户和用户组 #新建一个git用户组 sudo groupadd git #新建一 ...

  6. java基础之日期时间工具类

    package zy.test; import java.sql.Timestamp; import java.text.ParseException; import java.text.ParseP ...

  7. Unity strip engine code 遇到執行不能之問題與解決

    遊戲發布在 WebGL 平台發現檔案還是太大,因此在 IL2CPP 的環境下,開啟 Strip engine code 編譯功能,嘗試看看能不能減少一些檔案容量. 但由於我們另外有載入 Scene s ...

  8. 用C语言进行最基本的socket编程

    什么是socket 你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义.现在让我告诉你:它是使用 标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式.什 ...

  9. CloudStack 初始化执行命令流分析

                查询路由元素   选择可以使用的路由元素   需要将网络服务提供者的:虚拟路由和安全同时启用   { "createnetworkresponse" : { ...

  10. PythonScripter2.7报错ascii codec can't encode characters in position 0-1:ordinal not in range(128)

    1. 这是Python 2 mimetypes的bug2. 需要将Python2.7\lib\mimetypes.py文件中如下片段注释或删除:try: ctype = ctype.encode(de ...