C# OpenCvSharp DNN UNet 推理

目录

效果

模型

项目

代码

下载


效果

模型

Inputs
-------------------------
name:data
tensor:Float[1, 3, 256, 256]
---------------------------------------------------------------

Outputs
-------------------------
name:predict
tensor:Float[1, 2, 256, 256]
---------------------------------------------------------------

项目

代码

using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;
using System.Drawing;
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;

        string modelpath;

        int inpHeight;
        int inpWidth;

        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)
        {
            string modelTxt = "model/unet.prototxt";
            string modelBin = "model/unet.caffemodel";

            inpHeight = 256;
            inpWidth = 256;

            opencv_net = CvDnn.ReadNetFromCaffe(modelTxt, modelBin);

            image_path = "test_img/person.jpg";
            pictureBox1.Image = new Bitmap(image_path);

        }

        private unsafe void button2_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }
            textBox1.Text = "检测中,请稍等……";
            pictureBox2.Image = null;
            Application.DoEvents();

            Mat src = new Mat(image_path);

            int max_image_length = src.Cols > src.Rows ? src.Cols : src.Rows;
            Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
            Rect roi = new Rect(0, 0, src.Cols, src.Rows);
            src.CopyTo(new Mat(max_image, roi));

            Mat resize_image = max_image.Resize(new OpenCvSharp.Size(256, 256));

            BN_image = CvDnn.BlobFromImage(resize_image, 1 / 255.0, new OpenCvSharp.Size(inpWidth, inpHeight), new Scalar(127.5, 127.5, 127.5), true, false);

            //float* ptr = (float*)BN_image.Data;
            //for (int i = 0; i < 10; i++)
            //{
            //    Console.WriteLine(ptr[i]);
            //}

            opencv_net.SetInput(BN_image, "data");


            dt1 = DateTime.Now;

            Mat detection = opencv_net.Forward("predict");


            //float* ptr2 = (float*)detection.Data;
            //for (int i = 0; i < 10; i++)
            //{
            //    Console.WriteLine(ptr2[i]);
            //}

            dt2 = DateTime.Now;

            //得到的输出是一个四维的mat格式数据,大小为[1,2, 256, 256]
            //首先将他reshape,设置成一通道,512行,256列,其中前256行与后256行是互补关系,对应位置相加都为1
            //前256行为背景的概率,后256行为人像的概率
            Mat newMat = detection.Reshape(1, 512);
            //获取人像概率矩阵
            newMat = newMat.RowRange(256, 512);

            Mat result = new Mat();
            newMat.ConvertTo(result, MatType.CV_8U, 255.0);

            Cv2.Threshold(result, result, 127, 255, ThresholdTypes.Binary);

            Mat result2 = Mat.Zeros(256, 256, MatType.CV_8UC3) * 255;

            resize_image.CopyTo(result2, result);

            Cv2.ImShow("黑白", result);
            Cv2.ImShow("扣取", result2);

            pictureBox2.Image = new Bitmap(result2.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);
        }
    }
}


/*
Inputs
-------------------------
name:data
tensor:Float[1, 3, 256, 256]
---------------------------------------------------------------

Outputs
-------------------------
name:predict
tensor:Float[1, 2, 256, 256]
---------------------------------------------------------------
 */

using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;
using System.Drawing;
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;string modelpath;int inpHeight;int inpWidth;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){string modelTxt = "model/unet.prototxt";string modelBin = "model/unet.caffemodel";inpHeight = 256;inpWidth = 256;opencv_net = CvDnn.ReadNetFromCaffe(modelTxt, modelBin);image_path = "test_img/person.jpg";pictureBox1.Image = new Bitmap(image_path);}private unsafe void button2_Click(object sender, EventArgs e){if (image_path == ""){return;}textBox1.Text = "检测中,请稍等……";pictureBox2.Image = null;Application.DoEvents();Mat src = new Mat(image_path);int max_image_length = src.Cols > src.Rows ? src.Cols : src.Rows;Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);Rect roi = new Rect(0, 0, src.Cols, src.Rows);src.CopyTo(new Mat(max_image, roi));Mat resize_image = max_image.Resize(new OpenCvSharp.Size(256, 256));BN_image = CvDnn.BlobFromImage(resize_image, 1 / 255.0, new OpenCvSharp.Size(inpWidth, inpHeight), new Scalar(127.5, 127.5, 127.5), true, false);//float* ptr = (float*)BN_image.Data;//for (int i = 0; i < 10; i++)//{//    Console.WriteLine(ptr[i]);//}opencv_net.SetInput(BN_image, "data");dt1 = DateTime.Now;Mat detection = opencv_net.Forward("predict");//float* ptr2 = (float*)detection.Data;//for (int i = 0; i < 10; i++)//{//    Console.WriteLine(ptr2[i]);//}dt2 = DateTime.Now;//得到的输出是一个四维的mat格式数据,大小为[1,2, 256, 256]//首先将他reshape,设置成一通道,512行,256列,其中前256行与后256行是互补关系,对应位置相加都为1//前256行为背景的概率,后256行为人像的概率Mat newMat = detection.Reshape(1, 512);//获取人像概率矩阵newMat = newMat.RowRange(256, 512);Mat result = new Mat();newMat.ConvertTo(result, MatType.CV_8U, 255.0);Cv2.Threshold(result, result, 127, 255, ThresholdTypes.Binary);Mat result2 = Mat.Zeros(256, 256, MatType.CV_8UC3) * 255;resize_image.CopyTo(result2, result);Cv2.ImShow("黑白", result);Cv2.ImShow("扣取", result2);pictureBox2.Image = new Bitmap(result2.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);}}
}/*
Inputs
-------------------------
name:data
tensor:Float[1, 3, 256, 256]
---------------------------------------------------------------Outputs
-------------------------
name:predict
tensor:Float[1, 2, 256, 256]
---------------------------------------------------------------*/

下载

源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024网鼎杯青龙组初赛 web2

进入靶机之后是一个登录页面。随便登录就能进入 即使使用相同的账号密码&#xff0c;每次登录进去得到的接口也不一样 目录扫描可以发现存在一个/flag接口。但是需要boss身份才能读取到内容登录进去后的页面有更新计划功能&#xff0c;允许我们将js代码插入当前页面中同时将页…

Flutter仿京东商城APP实战 用户中心基础布局

用户中心界面 pages/tabs/user/user.dart import package:flutter/material.dart; import package:jdshop/utils/zdp_screen.dart; import package:provider/provider.dart;import ../../../store/counter_store.dart;class UserPage extends StatefulWidget {const UserPage…

D52【python 接口自动化学习】- python基础之模块与标准库

day52 标准库 学习日期&#xff1a;20241029 学习目标&#xff1a;模块与标准库 -- 67 标准库&#xff1a;Python默认提供的便携功能有哪些&#xff1f; 学习笔记 标准库中的常见组件 如何通过官方文档学习标准 from urllib.request import urlopen with urlopen(http://ww…

芒果YOLO11改进:免费|注意力机制SKNet:选择性内核网络结构,不同关注会产生融合层神经元有效感受野

&#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLO11 按步骤操作运行改进后的代码即可 YOLO11改进&#xff1a;注意力机制&#xff5c;YOLO11SKAttention改进内容&#x1f680;&#x1f680;&#x1f680; 文章目录 1. SKAttention 论文…

顺序表排序相关算法题|负数移到正数前面|奇数移到偶数前面|小于x的数移到大于x的数前面|快排思想(C)

负数移到正数前面 已知顺序表 ( a 1 , … , a n ) (a_{1},\dots,a_{n}) (a1​,…,an​)&#xff0c;每个元素都是整数&#xff0c;把所有值为负数的元素移到全部正数值元素前边 算法思想 快排的前后指针版本 排序|冒泡排序|快速排序|霍尔版本|挖坑版本|前后指针版本|非递归版…

如何在Linux系统中使用LVM进行磁盘管理

如何在Linux系统中使用LVM进行磁盘管理 LVM简介 安装LVM 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 创建物理卷 准备磁盘 创建卷组 创建逻辑卷 格式化逻辑卷 挂载逻辑卷 扩展逻辑卷 扩展现有物理卷 添加新的物理卷 调整卷组 调整卷组大小 使用LVM快照 LVM监控 查…

kaggle 数据集下载

文章目录 kaggle 数据集下载&#xff08;1&#xff09; 数据集下载&#xff08;2&#xff09; 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍&#xff0c;快忘得差不多了&#xff0c;惭愧。 参考了好多帖子&#xff0c;使用命令行…

力扣题86~90

题86&#xff08;中等&#xff09;&#xff1a; python代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def partition(self, head: Optional[Li…

rhcsa、ce复习(每日编辑,复习完为止)

红帽认证考试内容可以划分为以下几个主要模块&#xff1a; 1. 红帽认证系统管理员&#xff08;RHCSA&#xff09; 系统管理基础&#xff1a;包括安装和部署红帽企业Linux&#xff08;RHEL&#xff09;&#xff0c;磁盘分区&#xff0c;以及软件包的选择和管理。 用户和组…

探索 JavaScript 事件机制(四):React 合成事件系统

前言 在前端开发中&#xff0c;事件处理是不可或缺的一部分。在众多的前端框架中&#xff0c;React 凭借其高效和灵活性受到众多开发者的喜爱。React 的事件处理系统&#xff0c;即“合成事件系统”&#xff0c;是其性能优化的一大亮点。 本文将带你深入浅出地探索 React 的合…

反悔贪心学习笔记[浅谈]

贪心是信息学竞赛常考内容&#xff0c;一般来说为选择当前情况下最优情况的算法&#xff0c;非常好写&#xff0c;但部分贪心题目无法使用普通贪心解决&#xff0c;在这些题目中就有一类为反悔贪心。 反悔贪心经常会用到堆来为主答案&#xff0c;例题&#xff1a; Work Schedu…

java-web-day6-下-知识点小结

JDBC JDBC --是sun公司定义的一套操作所有关系型数据库的规范, 也就是接口api 数据库驱动 --是各个数据库厂家根据JDBC规范的具体实现, 例如mysql的驱动依赖 Lombok 简介 Lombok是一个实用的java类库, 通过注解的方式自动生成构造器, getter/setter, equals, hashcode, toStr…

Http 状态码 301 Permanent Rediret 302 Temporary Redirect、 重定向 重写

HTTP状态码301和302是什么&#xff1f; 1、HTTP状态码301 HTTP状态码301表示永久性转移&#xff08;Permanent Redirect&#xff09;&#xff0c;这意味着请求的资源已经被分配了一个新的URI&#xff0c;以后的引用应该使用资源现在所指的URI。 HTTP 301状态码表示请求的资源…

数据结构————map,set详解

今天带来map和set的详解&#xff0c;保证大家分清楚 一&#xff0c;概念 map和set是一种专门用来搜索的容器或数据结构 map能存储两个数据类型&#xff0c;我们称之为<key-value>模型 set只能存储一个数据类型&#xff0c;我们称之为纯<key>模型 它们的效率都非…

java中Scanner的nextLine和next方法

思考&#xff0c;输入1 2 3 4 5加上enter&#xff0c;输出什么 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[][] m new int[2][2];for (int i 0; i < 2; i) {for (int j 0; j < 2;…

互联网人小生意平台推荐,思考适合你的副业机会!

前几天写了一篇关于互联网人尽早找到自己一人能做的小生意&#xff0c;尽早觉醒&#xff1a;找到自己一人能做的互联网生意 收到不少读者私信和评论关于小生意怎么做&#xff0c;能感觉到大家对于如何开启小生意及如何利用好互联网平台这块充满兴趣。 尤其是针对设计、技术等互…

第5次CCF CSP认证真题解

1、数列分段 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/5/problem/0 区分每一段的方法就是判断数列中的每一个数是否与前一个数相等。 100分代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char *argv[]) {int n;ci…

C++ 模板专题 - 变长模板

一&#xff1a;概述 C 变长模板&#xff08;Variadic Templates&#xff09;允许你定义接受任意数量模板参数的模板。这种功能在 C11 中引入&#xff0c;非常灵活&#xff0c;常用于实现类型安全的容器、函数等。变长模板基本语法&#xff1a; template<typename... Args&g…

python 深度学习 项目调试 识别数学公式 LaTeX-OCR

起因&#xff0c; 目的: 提取图片中的数学公式。 其实这个项目&#xff0c;我很久之前就做过。 而且,我还录了一个视频: https://www.bilibili.com/video/BV1nD421p7jS/?vd_source198e876d811b3ccea94908fd163c223f 简介: 项目来源: https://github.com/lukas-blecher/La…

【专题】计算机网络之数据链路层

数据链路层的地位&#xff1a;网络中的主机、路由器等都必须实现数据链路层。 数据链路层信道类型&#xff1a; 点对点信道。 使用一对一的点对点通信方式。 广播信道。 使用一对多的广播通信方式。 必须使用专用的共享信道协议来协调这些主机的数据发送。 1. 使用点对点信道…