找斑点(blob)的最小旋转矩形(二)

 List<Point> contour6 = new List<Point>();//每旋转1度后的轮廓,
   
        private void buttonMinRect_Click(object sender, EventArgs e)//轮廓旋转90度,找出最小矩形面积
        {
            
            long minmianji = 666666666; int Recjiaodu = 0;
            if (maxblobindex != -1)//&&llp.Count!=0)
            {
                double x2 = 0;
                double y2 = 0;
                double m_CenterX = masscentre[maxblobindex].X;
                double m_CenterY = masscentre[maxblobindex].Y;
                for (int du = 0; du < 90; du++)
                {
                    contour6 = new List<Point>();
                    double theta = du;//0-90
                    theta = 3.1415926 * theta / 180.0;
                    for (int i = 0; i < singlefigure.Count; i++)
                    {

                        x2 = (singlefigure[i].X - m_CenterX) * Math.Cos(theta) + (singlefigure[i].Y - m_CenterY) * Math.Sin(theta);//即就是x0,y0-cx,cy
                        y2 = (singlefigure[i].Y - m_CenterY) * Math.Cos(theta) - (singlefigure[i].X - m_CenterX) * Math.Sin(theta);//即就是用完之后,x1,y1+cx,xy
                        x2 += m_CenterX;
                        y2 += m_CenterY;

                        contour6.Add(new Point((int)x2, (int)y2));
                    }
                    List<float> arr = new List<float>();
                    for (int i = 0; i < contour6.Count; i++)
                    {
                        arr.Add(contour6[i].X);
                    }
                    // 以上四个x,找出最大和最小,画出两条线;
                    float min = arr[0]; float max = arr[0];
                    for (int i = 0; i < arr.Count; i++)
                    {
                        if (min > arr[i])
                        {
                            min = arr[i];
                        }
                        if (max < arr[i])
                        {
                            max = arr[i];
                        }
                    }
                  
                    int ww = (int)Math.Abs(max - min);//两个x值
               
                    // 同样四个y,找出最大和最小,画出两条线;
                    arr = new List<float>();
                    for (int i = 0; i < contour6.Count; i++)
                    {
                        arr.Add(contour6[i].Y);
                    }
                    float min1 = arr[0]; float max1 = arr[0];
                    for (int i = 0; i < arr.Count; i++)
                    {
                        if (min1 > arr[i])
                        {
                            min1 = arr[i];
                        }
                        if (max1 < arr[i])
                        {
                            max1 = arr[i];
                        }
                    }

                    int hhh = (int)Math.Abs(max1 - min1);//两个y值//左顶(min,min1)及右底(max,max1)
               
                    long temp = ww * hhh;
                    if (temp < minmianji)
                    {
                        minmianji = temp;
                        Recjiaodu = du;
                    }
                 
                }
                textBox6.Text = "";
                textBox6.Text = (minmianji).ToString();
                textBox5.Text = "";
                textBox5.Text = (Recjiaodu).ToString();
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值