爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      C# OpenCvSharp DNN 部署yolov5不规则四边形目标检测

      首页 知识中心 云计算 文章详情页

      C# OpenCvSharp DNN 部署yolov5不规则四边形目标检测

      2024-07-31 08:37:05 阅读次数:34

      string,编程开发

      C# OpenCvSharp DNN 部署yolov5不规则四边形目标检测

      效果

      C# OpenCvSharp DNN 部署yolov5不规则四边形目标检测

      模型信息

      Inputs
      -------------------------
      name:images
      tensor:Float[1, 3, 1024, 1024]
      ---------------------------------------------------------------

      Outputs
      -------------------------
      name:output
      tensor:Float[1, 64512, 11]
      ---------------------------------------------------------------

      项目

      C# OpenCvSharp DNN 部署yolov5不规则四边形目标检测

      代码

      using OpenCvSharp;
       using OpenCvSharp.Dnn;
       using System;
       using System.Collections.Generic;
       using System.Drawing;
       using System.IO;
       using System.Linq;
       using System.Linq.Expressions;
       using System.Numerics;
       using System.Reflection;
       using System.Windows.Forms;namespace OpenCvSharp_DNN_Demo
       {
           public partial class frmMain : Form
           {
               public frmMain()
               {
                   InitializeComponent();
               }        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
               string image_path = "";        DateTime dt1 = DateTime.Now;
               DateTime dt2 = DateTime.Now;        float confThreshold;
               float nmsThreshold;
               float objThreshold;        float[,] anchors = new float[3, 6] {
                                                  {31, 30, 28, 49, 50, 31},
                                                  {46, 45, 58, 58, 74, 74},
                                                  {94, 94, 115, 115, 151, 151}
                                                  };        float[] stride = new float[3] { 8.0f, 16.0f, 32.0f };
              string modelpath;
              int inpHeight;
               int inpWidth;        List<string> class_names;
               int num_class;        Net opencv_net;
               Mat BN_image;        Mat image;
               Mat result_image;        private void button1_Click(object sender, EventArgs e)
               {
                   OpenFileDialog ofd = new OpenFileDialog();
                   ofd.Filter = fileFilter;
                   if (ofd.ShowDialog() != DialogResult.OK) return;            pictureBox1.Image = null;
                   pictureBox2.Image = null;
                   textBox1.Text = "";            image_path = ofd.FileName;
                   pictureBox1.Image = new Bitmap(image_path);
                   image = new Mat(image_path);
               }        private void Form1_Load(object sender, EventArgs e)
               {
                   confThreshold = 0.5f;
                   nmsThreshold = 0.5f;
                   objThreshold = 0.5f;            modelpath = "model/best.onnx";
                  inpHeight = 1024;
                   inpWidth = 1024;            opencv_net = CvDnn.ReadNetFromOnnx(modelpath);
                  class_names = new List<string>();
                   StreamReader sr = new StreamReader("model/coco.names");
                   string line;
                   while ((line = sr.ReadLine()) != null)
                   {
                       class_names.Add(line);
                   }
                   num_class = class_names.Count();            image_path = "test_img/1.png";
                   pictureBox1.Image = new Bitmap(image_path);        }
              float sigmoid(float x)
               {
                   return (float)(1.0 / (1 + Math.Exp(-x)));
               }        Mat ResizeImage(Mat srcimg, out int newh, out int neww, out int top, out int left)
               {
                   int srch = srcimg.Rows, srcw = srcimg.Cols;
                   top = 0;
                   left = 0;
                   newh = inpHeight;
                   neww = inpWidth;
                   Mat dstimg = new Mat();
                   if (srch != srcw)
                   {
                       float hw_scale = (float)srch / srcw;
                       if (hw_scale > 1)
                       {
                           newh = inpHeight;
                           neww = (int)(inpWidth / hw_scale);
                           Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh), 0, 0, InterpolationFlags.Area);
                           left = (int)((inpWidth - neww) * 0.5);
                           Cv2.CopyMakeBorder(dstimg, dstimg, 0, 0, left, inpWidth - neww - left, BorderTypes.Constant);
                       }
                       else
                       {
                           newh = (int)(inpHeight * hw_scale);
                           neww = inpWidth;
                           Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh), 0, 0, InterpolationFlags.Area);
                           top = (int)((inpHeight - newh) * 0.5);
                           Cv2.CopyMakeBorder(dstimg, dstimg, top, inpHeight - newh - top, 0, 0, BorderTypes.Constant);
                       }
                   }
                   else
                   {
                       Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh));
                   }
                   return dstimg;
               }        float IoU(BoxInfo polya, BoxInfo polyb, int max_w, int max_h)
               {
                   List<List<OpenCvSharp.Point>> poly_array0 = new List<List<OpenCvSharp.Point>>();
                   List<List<OpenCvSharp.Point>> poly_array1 = new List<List<OpenCvSharp.Point>>();
                   poly_array0.Add(polya.pts);
                   poly_array1.Add(polyb.pts);            Mat _poly0 = Mat.Zeros(max_h, max_w, MatType.CV_8UC1);
                   Mat _poly1 = Mat.Zeros(max_h, max_w, MatType.CV_8UC1);
                   Mat _result = new Mat();            List<List<OpenCvSharp.Point>> _pts0 = new List<List<OpenCvSharp.Point>>();
                   List<int> _npts0 = new List<int>();            foreach (var item in poly_array0)
                   {
                       if (item.Count < 3)//invalid poly
                           return -1f;                _pts0.Add(item);
                       _npts0.Add(item.Count);            }
                  List<List<OpenCvSharp.Point>> _pts1 = new List<List<OpenCvSharp.Point>>();
                   List<int> _npts1 = new List<int>();            foreach (var item in poly_array1)
                   {
                       if (item.Count < 3)//invalid poly
                           return -1f;                _pts1.Add(item);
                       _npts1.Add(item.Count);            }
                  Cv2.FillPoly(_poly0, _pts0, new Scalar(1));
                   Cv2.FillPoly(_poly1, _pts1, new Scalar(1));            Cv2.BitwiseAnd(_poly0, _poly1, _result);
                  int _area0 = Cv2.CountNonZero(_poly0);
                   int _area1 = Cv2.CountNonZero(_poly1);
                   int _intersection_area = Cv2.CountNonZero(_result);
                   float _iou = (float)_intersection_area / (float)(_area0 + _area1 - _intersection_area);
                   return _iou;
               }        void nms(List<BoxInfo> input_boxes, int max_w, int max_h)
               {
                   input_boxes.Sort((a, b) => { return a.score > b.score ? -1 : 1; });            bool[] isSuppressed = new bool[input_boxes.Count];
                  for (int i = 0; i < input_boxes.Count(); ++i)
                   {
                       if (isSuppressed[i]) { continue; }
                       for (int j = i + 1; j < input_boxes.Count(); ++j)
                       {
                           if (isSuppressed[j]) { continue; }
                           float ovr = IoU(input_boxes[i], input_boxes[j], max_w, max_h);
                           if (ovr >= nmsThreshold)
                           {
                               isSuppressed[j] = true;
                           }
                       }
                   }            for (int i = isSuppressed.Length - 1; i >= 0; i--)
                   {
                       if (isSuppressed[i])
                       {
                           input_boxes.RemoveAt(i);
                       }
                   }        }
              private unsafe void button2_Click(object sender, EventArgs e)
               {
                   if (image_path == "")
                   {
                       return;
                   }
                   textBox1.Text = "检测中,请稍等……";
                   pictureBox2.Image = null;
                   Application.DoEvents();            image = new Mat(image_path);
                  int newh = 0, neww = 0, padh = 0, padw = 0;
                   Mat dstimg = ResizeImage(image, out newh, out neww, out padh, out padw);            BN_image = CvDnn.BlobFromImage(dstimg, 1 / 255.0, new OpenCvSharp.Size(inpWidth, inpHeight), new Scalar(0, 0, 0), true, false);
                  //配置图片输入数据
                   opencv_net.SetInput(BN_image);            //模型推理,读取推理结果
                   Mat[] outs = new Mat[3] { new Mat(), new Mat(), new Mat() };
                   string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames().ToArray();            dt1 = DateTime.Now;
                  opencv_net.Forward(outs, outBlobNames);
                  dt2 = DateTime.Now;
                  int num_proposal = outs[0].Size(1);
                   int nout = outs[0].Size(2);            if (outs[0].Dims > 2)
                   {
                       outs[0] = outs[0].Reshape(0, num_proposal);
                   }            float ratioh = 1.0f * image.Rows / newh, ratiow = 1.0f * image.Cols / neww;
                  float* pdata = (float*)outs[0].Data;
                  List<BoxInfo> generate_boxes = new List<BoxInfo>();
                  int row_ind = 0;
                  for (int n = 0; n < 3; n++)
                   {                int num_grid_x = (int)(inpWidth / stride[n]);
                       int num_grid_y = (int)(inpHeight / stride[n]);                for (int q = 0; q < 3; q++)    //anchor
                       {
                           float anchor_w = anchors[n, q * 2];
                           float anchor_h = anchors[n, q * 2 + 1];
                           for (int i = 0; i < num_grid_y; i++)
                           {
                               for (int j = 0; j < num_grid_x; j++)
                               {
                                   float box_score = sigmoid(pdata[8]);
                                   if (box_score > objThreshold)
                                   {                                Mat scores = outs[0].Row(row_ind).ColRange(9, 9 + num_class);
                                       double minVal, max_class_socre;
                                       OpenCvSharp.Point minLoc, classIdPoint;
                                       // Get the value and location of the maximum score
                                       Cv2.MinMaxLoc(scores, out minVal, out max_class_socre, out minLoc, out classIdPoint);                                int class_idx = classIdPoint.X;
                                       max_class_socre = sigmoid((float)max_class_socre) * box_score;
                                       if (max_class_socre > confThreshold)
                                       {
                                           List<OpenCvSharp.Point> pts = new List<OpenCvSharp.Point>();
                                           for (int k = 0; k < 8; k += 2)
                                           {
                                               float x = (pdata[k] + j) * stride[n];  //x
                                               float y = (pdata[k + 1] + i) * stride[n];   //y
                                               x = (x - padw) * ratiow;
                                               y = (y - padh) * ratioh;
                                               pts.Add(new OpenCvSharp.Point(x, y));
                                           }                                    Rect r = Cv2.BoundingRect(pts);
                                          generate_boxes.Add(new BoxInfo(pts, (float)max_class_socre, class_idx));
                                       }
                                   }
                                   row_ind++;
                                   pdata += nout;
                               }
                           }                }
                  }
                  nms(generate_boxes, image.Cols, image.Rows);
                  result_image = image.Clone();
                  for (int ii = 0; ii < generate_boxes.Count; ++ii)
                   {
                       int idx = generate_boxes[ii].label;                for (int jj = 0; jj < 4; jj++)
                       {
                           Cv2.Line(result_image, generate_boxes[ii].pts[jj], generate_boxes[ii].pts[(jj + 1) % 4], new Scalar(0, 0, 255), 2);
                       }                string label = class_names[idx] + ":" + generate_boxes[ii].score.ToString("0.00");
                      int xmin = (int)generate_boxes[ii].pts[0].X;
                       int ymin = (int)generate_boxes[ii].pts[0].Y - 10;                Cv2.PutText(result_image, label, new OpenCvSharp.Point(xmin, ymin - 5), HersheyFonts.HersheySimplex, 0.75, new Scalar(0, 0, 255), 1);
                   }            pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
                   textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms";
               }        private void pictureBox2_DoubleClick(object sender, EventArgs e)
               {
                   Common.ShowNormalImg(pictureBox2.Image);
               }        private void pictureBox1_DoubleClick(object sender, EventArgs e)
               {
                   Common.ShowNormalImg(pictureBox1.Image);
               }
           }
       }
      using OpenCvSharp;
      using OpenCvSharp.Dnn;
      using System;
      using System.Collections.Generic;
      using System.Drawing;
      using System.IO;
      using System.Linq;
      using System.Linq.Expressions;
      using System.Numerics;
      using System.Reflection;
      using System.Windows.Forms;
      
      namespace OpenCvSharp_DNN_Demo
      {
          public partial class frmMain : Form
          {
              public frmMain()
              {
                  InitializeComponent();
              }
      
              string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
              string image_path = "";
      
              DateTime dt1 = DateTime.Now;
              DateTime dt2 = DateTime.Now;
      
              float confThreshold;
              float nmsThreshold;
              float objThreshold;
      
              float[,] anchors = new float[3, 6] {
                                                 {31, 30, 28, 49, 50, 31},
                                                 {46, 45, 58, 58, 74, 74},
                                                 {94, 94, 115, 115, 151, 151}
                                                 };
      
              float[] stride = new float[3] { 8.0f, 16.0f, 32.0f };
      
              string modelpath;
      
              int inpHeight;
              int inpWidth;
      
              List<string> class_names;
              int num_class;
      
              Net opencv_net;
              Mat BN_image;
      
              Mat image;
              Mat result_image;
      
              private void button1_Click(object sender, EventArgs e)
              {
                  OpenFileDialog ofd = new OpenFileDialog();
                  ofd.Filter = fileFilter;
                  if (ofd.ShowDialog() != DialogResult.OK) return;
      
                  pictureBox1.Image = null;
                  pictureBox2.Image = null;
                  textBox1.Text = "";
      
                  image_path = ofd.FileName;
                  pictureBox1.Image = new Bitmap(image_path);
                  image = new Mat(image_path);
              }
      
              private void Form1_Load(object sender, EventArgs e)
              {
                  confThreshold = 0.5f;
                  nmsThreshold = 0.5f;
                  objThreshold = 0.5f;
      
                  modelpath = "model/best.onnx";
      
                  inpHeight = 1024;
                  inpWidth = 1024;
      
                  opencv_net = CvDnn.ReadNetFromOnnx(modelpath);
      
                  class_names = new List<string>();
                  StreamReader sr = new StreamReader("model/coco.names");
                  string line;
                  while ((line = sr.ReadLine()) != null)
                  {
                      class_names.Add(line);
                  }
                  num_class = class_names.Count();
      
                  image_path = "test_img/1.png";
                  pictureBox1.Image = new Bitmap(image_path);
      
              }
      
              float sigmoid(float x)
              {
                  return (float)(1.0 / (1 + Math.Exp(-x)));
              }
      
              Mat ResizeImage(Mat srcimg, out int newh, out int neww, out int top, out int left)
              {
                  int srch = srcimg.Rows, srcw = srcimg.Cols;
                  top = 0;
                  left = 0;
                  newh = inpHeight;
                  neww = inpWidth;
                  Mat dstimg = new Mat();
                  if (srch != srcw)
                  {
                      float hw_scale = (float)srch / srcw;
                      if (hw_scale > 1)
                      {
                          newh = inpHeight;
                          neww = (int)(inpWidth / hw_scale);
                          Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh), 0, 0, InterpolationFlags.Area);
                          left = (int)((inpWidth - neww) * 0.5);
                          Cv2.CopyMakeBorder(dstimg, dstimg, 0, 0, left, inpWidth - neww - left, BorderTypes.Constant);
                      }
                      else
                      {
                          newh = (int)(inpHeight * hw_scale);
                          neww = inpWidth;
                          Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh), 0, 0, InterpolationFlags.Area);
                          top = (int)((inpHeight - newh) * 0.5);
                          Cv2.CopyMakeBorder(dstimg, dstimg, top, inpHeight - newh - top, 0, 0, BorderTypes.Constant);
                      }
                  }
                  else
                  {
                      Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh));
                  }
                  return dstimg;
              }
      
              float IoU(BoxInfo polya, BoxInfo polyb, int max_w, int max_h)
              {
                  List<List<OpenCvSharp.Point>> poly_array0 = new List<List<OpenCvSharp.Point>>();
                  List<List<OpenCvSharp.Point>> poly_array1 = new List<List<OpenCvSharp.Point>>();
                  poly_array0.Add(polya.pts);
                  poly_array1.Add(polyb.pts);
      
                  Mat _poly0 = Mat.Zeros(max_h, max_w, MatType.CV_8UC1);
                  Mat _poly1 = Mat.Zeros(max_h, max_w, MatType.CV_8UC1);
                  Mat _result = new Mat();
      
                  List<List<OpenCvSharp.Point>> _pts0 = new List<List<OpenCvSharp.Point>>();
                  List<int> _npts0 = new List<int>();
      
                  foreach (var item in poly_array0)
                  {
                      if (item.Count < 3)//invalid poly
                          return -1f;
      
                      _pts0.Add(item);
                      _npts0.Add(item.Count);
      
                  }
      
                  List<List<OpenCvSharp.Point>> _pts1 = new List<List<OpenCvSharp.Point>>();
                  List<int> _npts1 = new List<int>();
      
                  foreach (var item in poly_array1)
                  {
                      if (item.Count < 3)//invalid poly
                          return -1f;
      
                      _pts1.Add(item);
                      _npts1.Add(item.Count);
      
                  }
      
                  Cv2.FillPoly(_poly0, _pts0, new Scalar(1));
                  Cv2.FillPoly(_poly1, _pts1, new Scalar(1));
      
                  Cv2.BitwiseAnd(_poly0, _poly1, _result);
      
                  int _area0 = Cv2.CountNonZero(_poly0);
                  int _area1 = Cv2.CountNonZero(_poly1);
                  int _intersection_area = Cv2.CountNonZero(_result);
                  float _iou = (float)_intersection_area / (float)(_area0 + _area1 - _intersection_area);
                  return _iou;
              }
      
              void nms(List<BoxInfo> input_boxes, int max_w, int max_h)
              {
                  input_boxes.Sort((a, b) => { return a.score > b.score ? -1 : 1; });
      
                  bool[] isSuppressed = new bool[input_boxes.Count];
      
                  for (int i = 0; i < input_boxes.Count(); ++i)
                  {
                      if (isSuppressed[i]) { continue; }
                      for (int j = i + 1; j < input_boxes.Count(); ++j)
                      {
                          if (isSuppressed[j]) { continue; }
                          float ovr = IoU(input_boxes[i], input_boxes[j], max_w, max_h);
                          if (ovr >= nmsThreshold)
                          {
                              isSuppressed[j] = true;
                          }
                      }
                  }
      
                  for (int i = isSuppressed.Length - 1; i >= 0; i--)
                  {
                      if (isSuppressed[i])
                      {
                          input_boxes.RemoveAt(i);
                      }
                  }
      
              }
      
              private unsafe void button2_Click(object sender, EventArgs e)
              {
                  if (image_path == "")
                  {
                      return;
                  }
                  textBox1.Text = "检测中,请稍等……";
                  pictureBox2.Image = null;
                  Application.DoEvents();
      
                  image = new Mat(image_path);
      
                  int newh = 0, neww = 0, padh = 0, padw = 0;
                  Mat dstimg = ResizeImage(image, out newh, out neww, out padh, out padw);
      
                  BN_image = CvDnn.BlobFromImage(dstimg, 1 / 255.0, new OpenCvSharp.Size(inpWidth, inpHeight), new Scalar(0, 0, 0), true, false);
      
                  //配置图片输入数据
                  opencv_net.SetInput(BN_image);
      
                  //模型推理,读取推理结果
                  Mat[] outs = new Mat[3] { new Mat(), new Mat(), new Mat() };
                  string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames().ToArray();
      
                  dt1 = DateTime.Now;
      
                  opencv_net.Forward(outs, outBlobNames);
      
                  dt2 = DateTime.Now;
      
                  int num_proposal = outs[0].Size(1);
                  int nout = outs[0].Size(2);
      
                  if (outs[0].Dims > 2)
                  {
                      outs[0] = outs[0].Reshape(0, num_proposal);
                  }
      
                  float ratioh = 1.0f * image.Rows / newh, ratiow = 1.0f * image.Cols / neww;
      
                  float* pdata = (float*)outs[0].Data;
      
                  List<BoxInfo> generate_boxes = new List<BoxInfo>();
      
                  int row_ind = 0;
      
                  for (int n = 0; n < 3; n++)
                  {
      
                      int num_grid_x = (int)(inpWidth / stride[n]);
                      int num_grid_y = (int)(inpHeight / stride[n]);
      
                      for (int q = 0; q < 3; q++)    //anchor
                      {
                          float anchor_w = anchors[n, q * 2];
                          float anchor_h = anchors[n, q * 2 + 1];
                          for (int i = 0; i < num_grid_y; i++)
                          {
                              for (int j = 0; j < num_grid_x; j++)
                              {
                                  float box_score = sigmoid(pdata[8]);
                                  if (box_score > objThreshold)
                                  {
      
                                      Mat scores = outs[0].Row(row_ind).ColRange(9, 9 + num_class);
                                      double minVal, max_class_socre;
                                      OpenCvSharp.Point minLoc, classIdPoint;
                                      // Get the value and location of the maximum score
                                      Cv2.MinMaxLoc(scores, out minVal, out max_class_socre, out minLoc, out classIdPoint);
      
                                      int class_idx = classIdPoint.X;
                                      max_class_socre = sigmoid((float)max_class_socre) * box_score;
                                      if (max_class_socre > confThreshold)
                                      {
                                          List<OpenCvSharp.Point> pts = new List<OpenCvSharp.Point>();
                                          for (int k = 0; k < 8; k += 2)
                                          {
                                              float x = (pdata[k] + j) * stride[n];  //x
                                              float y = (pdata[k + 1] + i) * stride[n];   //y
                                              x = (x - padw) * ratiow;
                                              y = (y - padh) * ratioh;
                                              pts.Add(new OpenCvSharp.Point(x, y));
                                          }
      
                                          Rect r = Cv2.BoundingRect(pts);
      
                                          generate_boxes.Add(new BoxInfo(pts, (float)max_class_socre, class_idx));
                                      }
                                  }
                                  row_ind++;
                                  pdata += nout;
                              }
                          }
      
                      }
      
                  }
      
                  nms(generate_boxes, image.Cols, image.Rows);
      
                  result_image = image.Clone();
      
                  for (int ii = 0; ii < generate_boxes.Count; ++ii)
                  {
                      int idx = generate_boxes[ii].label;
      
                      for (int jj = 0; jj < 4; jj++)
                      {
                          Cv2.Line(result_image, generate_boxes[ii].pts[jj], generate_boxes[ii].pts[(jj + 1) % 4], new Scalar(0, 0, 255), 2);
                      }
      
                      string label = class_names[idx] + ":" + generate_boxes[ii].score.ToString("0.00");
      
                      int xmin = (int)generate_boxes[ii].pts[0].X;
                      int ymin = (int)generate_boxes[ii].pts[0].Y - 10;
      
                      Cv2.PutText(result_image, label, new OpenCvSharp.Point(xmin, ymin - 5), HersheyFonts.HersheySimplex, 0.75, new Scalar(0, 0, 255), 1);
                  }
      
                  pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
                  textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms";
              }
      
              private void pictureBox2_DoubleClick(object sender, EventArgs e)
              {
                  Common.ShowNormalImg(pictureBox2.Image);
              }
      
              private void pictureBox1_DoubleClick(object sender, EventArgs e)
              {
                  Common.ShowNormalImg(pictureBox1.Image);
              }
          }
      }
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/lw112190/8918357,作者:lw112190,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【计算机算法设计与分析】6-6 n后问题(C++_分支限界法)

      下一篇:初学Android,数据存储之读写SD卡文件(四十三)

      相关文章

      2025-05-19 09:04:53

      读取模版并生成html文件

      读取模版并生成html文件

      2025-05-19 09:04:53
      exception , html , string
      2025-05-16 09:15:17

      记录一个傻错误:“error: expected identifier before string constant“

      记录一个傻错误:“error: expected identifier before string constant“

      2025-05-16 09:15:17
      string
      2025-05-12 08:40:18

      List<T>的使用

      List<T>的使用

      2025-05-12 08:40:18
      List , string
      2025-04-15 09:20:22

      初学Java,IO之使用转换流,读取键盘输入(四十三)

      初学Java,IO之使用转换流,读取键盘输入(四十三)

      2025-04-15 09:20:22
      buffer , import , java , string
      2025-03-31 08:49:25

      java面试题之编程【火星车问题】

      java面试题之编程【火星车问题】

      2025-03-31 08:49:25
      command , java , string , 编程 , 面试
      2025-03-25 08:07:53

      【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列|2558

      【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列|2558

      2025-03-25 08:07:53
      cur , int , length , return , string , 序列
      2025-03-24 08:53:22

      C++算法:214最短回文串

      C++算法:214最短回文串

      2025-03-24 08:53:22
      amp , int , return , string , 回文
      2025-03-24 08:45:46

      【Clng与Cint】clng与cint的区别及防溢出函数

      【Clng与Cint】clng与cint的区别及防溢出函数

      2025-03-24 08:45:46
      end , response , string , write , 溢出
      2025-03-21 06:56:46

      【shell】shell脚本读取给定参数|参数个数

      【shell】shell脚本读取给定参数|参数个数

      2025-03-21 06:56:46
      string , 参数 , 右边 , 字符 , 截取
      2025-03-11 09:35:39

      shell文件通配符(9):任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

      shell文件通配符(9):任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

      2025-03-11 09:35:39
      string , 任意 , 匹配 , 字符 , 通配符
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5226610

      查看更多

      最新文章

      一种JavaScript里小数的精确计算方式

      2024-08-08 09:40:21

      NumPy 与 Python 内置列表计算标准差的区别

      2024-08-08 09:40:21

      初学Android,数据存储之读写SD卡文件(四十三)

      2024-08-01 09:02:41

      C# OpenCvSharp DNN 部署YOLOV6目标检测

      2024-07-31 08:37:05

      【计算机算法设计与分析】矩阵连乘问题(C++_DP)

      2024-07-30 09:34:10

      【计算机算法设计与分析】7-6 皇后控制问题(C++_拉斯维加斯算法(Las Vegas))

      2024-07-30 09:34:10

      查看更多

      热门文章

      计算数字k在0到n中的出现的次数,k可能是0~9的一个值

      2024-04-23 09:59:26

      Java实现:如何计算根据概率的中奖率

      2024-07-16 10:04:23

      Twitter的分布式自增ID算法snowflake(雪花算法) C#和Java版

      2024-07-23 09:27:02

      【计算机算法设计与分析】7-6 皇后控制问题(C++_拉斯维加斯算法(Las Vegas))

      2024-07-30 09:34:10

      JavaScript和ABAP的MD5计算源代码

      2024-07-19 09:17:17

      C# OpenCvSharp DNN 部署YOLOV6目标检测

      2024-07-31 08:37:05

      查看更多

      热门标签

      系统 测试 用户 分布式 Java java 计算机 docker 代码 数据 服务器 数据库 源码 管理 python
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Java实现:如何计算根据概率的中奖率

      计算数字k在0到n中的出现的次数,k可能是0~9的一个值

      【计算机算法设计与分析】7-6 皇后控制问题(C++_拉斯维加斯算法(Las Vegas))

      【计算机算法设计与分析】矩阵连乘问题(C++_DP)

      JavaScript和ABAP的MD5计算源代码

      NumPy 与 Python 内置列表计算标准差的区别

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号