⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 circle.cpp

📁 This program uses principle of the Image Processing to find center of circles.
💻 CPP
字号:
#include "cimg.h"
using namespace cimg_library;

int main()
{
	CImg<unsigned char> img("cir.bmp");	CImg<> edge2=img.get_channel(0);
	CImg<> midx=img.get_channel(0);		CImg<> midy=img.get_channel(0);
	CImg<> blur=img.get_channel(0);		CImg<unsigned char> graph("graphcir.bmp");

/**************************** edge detection *************************************/
	int a=0, n=0, x=1, y=1, i=1, j=1; 
	int threshold=80;

	for (y=1; y<img.height-1; y++)
	{
		for (x=1; x<img.width-1; x++)
		{	
			edge2(x,y)=255;
		}
	}

	x=1;	y=1;
	for (y=1; y<img.height-1; y++)
	{
		for (x=1; x<img.width-1; x++)
		{		
		    
			n=((2*img(x-1,y))-img(x,y)-(2*img(x+1,y))-img(x+2,y)+(2*img(x+3,y)))/7;
			midx(x,y)=n;
		}
	}

	x=1;	y=1;	a=0;	n=0;
	for (x=1; x<img.width-1; x++)
	{
		for (y=1; y<img.height-1; y++)
		{
			n=((2*img(x,y-1))-img(x,y)-(2*img(x,y+1))-img(x,y+2)+(2*img(x,y+3)))/7;
			midy(x,y)=n;
		}
	}

	for (j=1; j<img.height-1; j++)
	{
		for (i=1; i<img.width-1; i++)
		{
			if((midx(i-1,j)>0 && midx(i+1,j)<0) || (midx(i-1,j)<0 && midx(i+1,j)>0))
				edge2(i,j)=0;		//black
			
			if((midy(i,j-1)>0 && midy(i,j+1)<0) || (midy(i,j-1)<0 && midy(i,j+1)>0))
				edge2(i,j)=0;		//black
		}
	}
/********************************** blur *************************************/
	for (int m=1;m<edge2.height-1;m++)       
	{
		for (int n=1;n<edge2.width-1;n++)
		{
		 blur(n,m)=(edge2(n-1,m-1)+edge2(n,m-1)+edge2(n+1,m-1)+edge2(n-1,m)+edge2(n,m)
			        +edge2(n+1,m)+edge2(n-1,m+1)+edge2(n,m+1)+edge2(n+1,m+1))/9;
		}    
	}
/********************** find center (a,b) of circle *****************************/
	float Gy,Gx,t,q;
	float pi=3.14159;
	int b;

	for (int yy=0; yy<blur.height; yy++)
	{
		for (int xx=0; xx<blur.width; xx++)
		{
			if (blur(xx,yy)>=80)
			{
				Gy=blur(xx,yy+1)-blur(xx,yy);
				Gx=blur(xx+1,yy)-blur(xx,yy);

				if ((Gy==0)&&(Gx==0)) q=pi/2;
				else
					if((Gy!=0)&&(Gx==0)) q=0;
					else
						q=atan(Gy/Gx); 
				
				for (int a=0; a<graph.width; a++)
				{		
					t=tan(q);	
					b = (a-xx)*t + yy ;
					if (b>=0 && b<=graph.height)
					{
						graph(a,b)+=4;
					}
				}
			
			}
		}
	}
		
	img.display("circle");
	edge2.display("edge");
	blur.display("blur edge");
	graph.display("graph");

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -