日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv——pcb上寻找mark点(拟合椭圆的方法) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#include "stdafx.h"
// FitCircle.cpp : 定義控制臺應(yīng)用程序的入口
#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++) // 直方圖統(tǒng)計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點坐標(biāo)"<<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;}
/*============================================================================
=  代碼內(nèi)容:基本全局閾值法   迭代法                            
==============================================================================*/
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);                           //  數(shù)據(jù)未穩(wěn)定,繼續(xù)//cout<<"The Threshold of this Image in BasicGlobalThreshold is:"<<k1<<endl;return(k1);                              //  返回閾值
}

轉(zhuǎn)載于:https://www.cnblogs.com/nanyangzp/p/3496508.html

總結(jié)

以上是生活随笔為你收集整理的opencv——pcb上寻找mark点(拟合椭圆的方法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。