#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",0);//IplImage* imgGrey=cvLoadImage("28027.jpg",0);cvNamedWindow("原始图像");//cvShowImage("fa",imgGrey);cvShowImage("原始图像",imgGrey);double t=(double)getTickCount();IplImage* imgBasicGlobalThreshold = cvCreateImage(cvGetSize(imgGrey),IPL_DEPTH_8U,1);cvCopyImage(imgGrey,imgBasicGlobalThreshold);int pg[256],i,thre; for (i=0;i<256;i++) pg[i]=0;for (i=0;i<imgBasicGlobalThreshold->imageSize;i++) // 直方图统计pg[(BYTE)imgBasicGlobalThreshold->imageData[i]]++; thre = BasicGlobalThreshold(pg,0,256); // 确定阈值cout<<"The Threshold of this Image in BasicGlobalThreshold is:"<<thre<<endl;//输出显示阀值
cvThreshold(imgBasicGlobalThreshold,imgBasicGlobalThreshold,thre,255,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(0);}CvBox2D findRectContours(IplImage *src)
{CvBox2D box1;IplImage* des=cvCreateImage(cvGetSize(src),src->depth,src->nChannels);cvZero(des);CvMemStorage* memory=cvCreateMemStorage(0);CvSeq* Icontour=NULL;CvSeq* maxContour =NULL;cvShowImage("原始图像1",src);cvFindContours(src,memory,&Icontour, sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));double area=0;double maxArea=0;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>500 && area<20000){goto l1;}elsegoto 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(255,255,255), CV_RGB(255, 255,255), 0, 1, 8, cvPoint(0,0));box1=box0;cvDrawCircle(des,cvPoint(box0.center.x,box0.center.y),1,cvScalar(255,255,255),2,8,0);//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=0;     u=0;for (i=start;i<end;i++) {t+=pg[i];        u+=i*pg[i];}k2=(int) (u/t);                          //  计算此范围灰度的平均值    do {k1=k2;t1=0;    u1=0;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=0;if (t2) u2=u2/t2;                     //  计算高灰度组的平均值else u2=0;k2=(int) ((u1+u2)/2);                 //  得到新的阈值估计值
    }while(k1!=k2);                           //  数据未稳定,继续//cout<<"The Threshold of this Image in BasicGlobalThreshold is:"<<k1<<endl;return(k1);                              //  返回阈值
}

转载于:https://www.cnblogs.com/nanyangzp/p/3496508.html

opencv——pcb上寻找mark点(拟合椭圆的方法)相关推荐

  1. 最小二乘法拟合椭圆——MATLAB和Qt-C++实现

    本小节Jungle尝试用最小二乘法拟合椭圆,并用MATLAB和C++实现. 1.理论知识 平面上任意位置的一个椭圆,其中心坐标为(x0,y0),半长轴a,半短轴b,长轴偏角为θ,方程通式为 其中 在原 ...

  2. 【opencv】轮廓特征(质心,面积,周长,近似轮廓,凸包,凸度,边界矩形,直角矩形,旋转矩形,最小闭合圈,拟合椭圆、直线)

    4_9_2_轮廓特征 - OpenCV中文官方文档 找到轮廓的不同特征,例如面积,周长,质心,边界框等. 1. 特征矩 特征矩可以帮助您计算一些特征,例如物体的质心,物体的面积等.请查看特征矩上的维基 ...

  3. 使用Python,OpenCV对图像进行亚像素点检测,并拟合椭圆进行绘制

    这篇博客将介绍如何使用Python,OpenCV对图像进行亚像素检测,并对亚像素点进行椭圆拟合绘制. 1. 效果图 原始图上绘制拟合椭圆 VS 原始图上绘制拟合椭圆及亚像素点绘制随机半径及颜色的圆 V ...

  4. 【千律】OpenCV基础:图像外接矩形、最小外接矩形、凸包、外接圆、拟合椭圆的绘制

    环境:Python3.8 和 OpenCV 内容:图像外接矩形.最小外接矩形.凸包.外接圆.拟合椭圆的绘制 import cv2 as cv import numpy as np import mat ...

  5. opencv 图像轮廓特征 图像面积,轮廓周长,外接矩形、最小外接矩形、最小外接圆、拟合椭圆

    找出图像轮廓 contours, hierarchy = cv.findContours(thresh, 3, 2) 画出图像轮廓 cnt = contours[1] cv.drawContours( ...

  6. Ransac拟合椭圆

    一.Ransac算法介绍 RANSAC(RAndom SAmple Consensus,随机采样一致)最早是由Fischler和Bolles在SRI上提出用来解决LDP(Location Determ ...

  7. 地图上绘制任意角度的椭圆_地图上的总椭圆

    地图上绘制任意角度的椭圆 或者,如何选择下班后去海滩的最佳方式 (Or, how to choose the best way to walk to the beach after work) It ...

  8. 使用Python,OpenCV沿着轮廓寻找极值点

    使用Python,OpenCV沿着轮廓寻找极值点 这篇博客将介绍如何使用Python,OpenCV沿着轮廓寻找极值点,找到最北.最南.最东和最西(x,y)坐标.虽然这项技能本身并不有用,但它通常被用作 ...

  9. 最小二乘法拟合椭圆(椭圆拟合线)

    参考文章: 最小二乘法拟合椭圆--MATLAB和Qt-C++实现 https://blog.csdn.net/sinat_21107433/article/details/80877758 以上文章中 ...

最新文章

  1. Centos7多内核情况下修改默认启动内核方法
  2. 2021湖北高考个人成绩排名查询,2021湖北高考总成绩一分一段排名
  3. Spring IOC 如何解决循环依赖?
  4. c 连接mysql错误信息_使用C语言访问MySQL数据 —— 连接和错误处理
  5. mysql导入数据提前修改字段_复习MySQL③导入数据、检查及修改
  6. 安装centos7步骤_Centos7下源码编译安装mysql5.7 详细步骤 小白也能安装
  7. 蓝桥杯 入门训练 序列求和
  8. 晶体管游戏 linux,Industrial Linux
  9. C++ Templates 学习历程一
  10. python 操作access数据库
  11. 3) Maven 目录结构
  12. 概率密度,概率分布和联合概率分布
  13. python数据分布统计_Python 数据可视化:数据分布统计图和热图
  14. 爱也可以量化?用4个公式表征爱情
  15. 中国鸡荣华鸡为什么干不过洋鸡肯德基
  16. Helix QAC企业级自动代码静态分析器
  17. Confluence7.4安装
  18. MATPLOTLIB
  19. 黄飞 130702010037
  20. 开发中Flume的扇出机制的使用

热门文章

  1. 2021-2027年中国透明导电膜玻璃行业市场研究及前瞻分析报告
  2. 2022-2028年中国煤制天然气市场投资分析及前景预测报告
  3. 【Sql Server】DateBase-子查询
  4. 时间统计%time和%timeit_python
  5. 高通为何46亿美元ADAS Veoneer Arriver
  6. Camera Lens Coating
  7. 2021年大数据Spark(四十一):SparkStreaming实战案例六 自定义输出 foreachRDD
  8. HTTP/HTTPS的请求和响应
  9. 【网站汇总】论文相关
  10. HarmonyOS ScrollView 使用