//图像的矩,计算图形的中心
private void btn_moments_Click(object sender, EventArgs e)
{
if (ib_original.Image != null)
{
Mat src = new Image<Bgr, byte>(ib_original.Image.Bitmap).Mat;
Mat dst = new Mat();
CvInvoke.Canny(src, dst, 120, 180);
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
CvInvoke.FindContours(dst, contours, null, Emgu.CV.CvEnum.RetrType.External,
Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxNone);
//筛选出面积不为0的轮廓并画出
VectorOfVectorOfPoint use_contours = new VectorOfVectorOfPoint();
for (int i = 0; i < contours.Size; i++)
{
//获取独立的连通轮廓
VectorOfPoint contour = contours[i];
//计算连通轮廓的面积
double area = CvInvoke.ContourArea(contour);
//进行面积筛选
if (area > 0)
{
//添加筛选后的连通轮廓
use_contours.Push(contour);
}
}
CvInvoke.DrawContours(src, use_contours, -1, new MCvScalar(0, 0, 255));
//计算轮廓中心并画出
int ksize = use_contours.Size;
double[] m00 = new double[ksize];
double[] m01 = new double[ksize];
double[] m10 = new double[ksize];
Point[] gravity = new Point[ksize];//用于存储轮廓中心点坐标
MCvMoments[] moments = new MCvMoments[ksize];
for (int i = 0; i < ksize; i++)
{
VectorOfPoint contour = use_contours[i];
//计算当前轮廓的矩
moments[i] = CvInvoke.Moments(contour, false);
m00[i] = moments[i].M00;
m01[i] = moments[i].M01;
m10[i] = moments[i].M10;
int x = Convert.ToInt32(m10[i] / m00[i]);//计算当前轮廓中心点坐标
int y = Convert.ToInt32(m01[i] / m00[i]);
gravity[i] = new Point(x, y);
}
//画出中心点位置
foreach (Point cent in gravity)
{
CvInvoke.Circle(src, cent, 2, new MCvScalar(0, 0, 255), 2);
}
ib_result.Image = src;
}
}
EmguCv图像的矩(计算轮廓中心)
猜你喜欢
转载自blog.csdn.net/xjjatdna/article/details/85534788
今日推荐
周排行