zoukankan      html  css  js  c++  java
  • 坐标计算与面积重叠比较

          比如拿到一张图片,包含图片中所有人物的坐标,这时,需要在Web网页上显示该图并选中坐标包含的目标人物

         第一步: 先确定好坐标是(x1,y1,x2,y2) 还是(x1,y1,w,h)格式,如果是第二种,稍微多点计算,这里就以第二种方式为例

                            //获取原图坐标
                            Coors cor = new Coors();
                            int m_X = Convert.ToInt32(item.Coordinate_X.ToString());
                            int m_Y = Convert.ToInt32(item.Coordinate_Y.ToString());
                            int m_W = Convert.ToInt32(item.Coordinate_W.ToString());
                            int m_H = Convert.ToInt32(item.Coordinate_H.ToString());
                            //拼接FTP地址
                            //var url = string.Format("ftp://{0}:{1}@{2}/{3}", linuxFtpUser, linuxFtpPwd, linuxIp, path);
                            var Url = item.imgpath.Replace("ftp:", "ftp:/");
                            byte[] buffer = new WebClient().DownloadData(Url);
                            //byte[] 转内存流
                            MemoryStream ms = new MemoryStream(buffer);
                            Image img = Image.FromStream(ms, true);
                            //流用完要及时关闭  
                            ms.Close();
                            //加载图片
                            Bitmap bmp = new Bitmap(img);
                            System.Drawing.Image tempimage = bmp;
                            //原图宽、高
                            var imagewidth = tempimage.Width;//
                            var imageheight = tempimage.Height;////原图目标坐标
                            var x1 = m_X;
                            var y1 = m_Y;
                            var x2 = x1 + m_W;
                            var y2 = y1 + m_H;
                            //画布宽高
                            double divWid = Convert.ToDouble(topCavWidth);
                            double divHig = Convert.ToDouble(topCavHeight);
                            //宽比例
                            double CompareWid = divWid / imagewidth;
                            //高比例
                            double CompareHig = divHig / imageheight;
                            //界面中坐标
                            cor.NewX1 = x1 * CompareWid;
                            cor.NewY1 = y1 * CompareHig;
                            cor.NewX2 = x2 * CompareWid;
                            cor.NewY2 = y2 * CompareHig;

    其实就是 先将坐标(x1,y1,W,H)转为两点式(x1,y1,x1+w,y1+h),再拿到 web界面的上的宽高/原图的宽高的比例,按照各自对应的比例进行乘法便可得到web界面上图片对应的坐标。

    当我们拿到两组坐标,需要算重叠率时候,先将坐标转换为 Rectangle(int x,int y,int width,int height) 类型,再进行比较

            public static float ComputRectJoinUnion(Rectangle rc1, Rectangle rc2)
            {
                Point p1 = new Point();
                Point p2 = new Point(); ;                 //p1为相交位置的左上角坐标,p2为相交位置的右下角坐标
                p1.X = Math.Max(rc1.X, rc2.X);
                p1.Y = Math.Max(rc1.Y, rc2.Y);
    
                p2.X = Math.Min(rc1.X + rc1.Width, rc2.X + rc2.Width);
                p2.Y = Math.Min(rc1.Y + rc1.Height, rc2.Y + rc2.Height);
    
                float AJoin = 0;
                if (p2.X > p1.X && p2.Y > p1.Y)            //判断是否相交
                {
                    AJoin = (p2.X - p1.X) * (p2.Y - p1.Y);    //如果先交,求出相交面积
                }
                float A1 = rc1.Width * rc1.Height;
                float A2 = rc2.Width * rc2.Height;
                float AUnion = (A1 + A2 - AJoin);                 //两者组合的面积
    
                if (AUnion > 0)
                    return (AJoin / AUnion);                  //相交面积与组合面积的比例
                else
                    return 0;
            }
  • 相关阅读:
    Primeface datatable celleditor rowedit 例子
    JAVA Assert
    POI 日期类型的显示,日期类型存储为Double,数字类型雷同,为了显示为日期格式。。。
    hibernate3支持中文查询
    VC2010 编写DLL并调用;
    android 数据库例子
    VC2010 OPENCV 配置攻略;生成opencv向导
    VC2012 MFC 项目 mfc100.lib 位置
    QQ自动远程连接 JNA
    EXCEL 中 get.cell 函数的参数
  • 原文地址:https://www.cnblogs.com/Sientuo/p/10785567.html
Copyright © 2011-2022 走看看