C# OpenCV 部署RecRecNet广角图像畸变矫正

C# OpenCV 部署RecRecNet广角图像畸变矫正

目录

说明

效果

模型信息

项目

代码

下载


说明

ICCV2023 - RecRecNet: Rectangling Rectified Wide-Angle Images by Thin-Plate Spline Model and DoF-based Curriculum Learning

参考:

https://github.com/KangLiao929/RecRecNet

https://github.com/hpc203/recrecnet-opencv-dnn

效果

模型信息

Model Properties
-------------------------
---------------------------------------------------------------

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

Outputs
-------------------------
name:output
tensor:Float[1, 162]
---------------------------------------------------------------

项目

代码

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

        int inpHeight;
        int inpWidth;
        string modelpath;

        int grid_h = 8;
        int grid_w = 8;
        Mat grid;
        Mat W_inv;

        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)
        {
            modelpath = "model/model_deploy.onnx";

            inpHeight = 256;
            inpWidth = 256;

            opencv_net = CvDnn.ReadNetFromOnnx(modelpath);

            Common.get_norm_rigid_mesh_inv_grid(ref grid, ref W_inv, inpHeight, inpWidth, grid_h, grid_w);

            image_path = "test_img/10.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();

            image = new Mat(image_path);
            dt1 = DateTime.Now;

            Mat img = new Mat();

            Cv2.Resize(image, img, new OpenCvSharp.Size(inpWidth, inpHeight));

            img.ConvertTo(img, MatType.CV_32FC3, 1.0f / 127.5f, -1.0f);

            BN_image = CvDnn.BlobFromImage(img);

            //配置图片输入数据
            opencv_net.SetInput(BN_image);

            //模型推理,读取推理结果
            Mat[] outs = new Mat[1] { new Mat() };
            string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames().ToArray();

            opencv_net.Forward(outs, outBlobNames);

            dt2 = DateTime.Now;

            float* offset = (float*)outs[0].Data;

            Mat tp = new Mat();
            Mat ori_mesh_np_x = new Mat();
            Mat ori_mesh_np_y = new Mat();
            Common.get_ori_rigid_mesh_tp(tp, ori_mesh_np_x, ori_mesh_np_y, offset, inpHeight, inpWidth, grid_h, grid_w);
            Mat T = W_inv * tp;   
            T = T.T();    

            Mat T_g = T * grid;

            Mat output_tps = Common._interpolate(BN_image, T_g, new OpenCvSharp.Size(inpWidth, inpHeight));
            Mat rectangling_np = (output_tps + 1) * 127.5;
            rectangling_np.ConvertTo(rectangling_np, MatType.CV_8UC3);
            Mat input_np = (img + 1) * 127.5;

            List<Mat> outputs = new List<Mat>();
            outputs.Add(rectangling_np);
            outputs.Add(input_np);
            outputs.Add(ori_mesh_np_x);
            outputs.Add(ori_mesh_np_y);

            Mat input_with_mesh = Common.draw_mesh_on_warp(outputs[1], outputs[2], outputs[3]);

            Cv2.CvtColor(outputs[0], outputs[0], ColorConversionCodes.BGR2RGB);

            Cv2.ImShow("mesh", input_with_mesh);

            result_image = outputs[0].Clone();
            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.Linq;
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;int inpHeight;int inpWidth;string modelpath;int grid_h = 8;int grid_w = 8;Mat grid;Mat W_inv;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){modelpath = "model/model_deploy.onnx";inpHeight = 256;inpWidth = 256;opencv_net = CvDnn.ReadNetFromOnnx(modelpath);Common.get_norm_rigid_mesh_inv_grid(ref grid, ref W_inv, inpHeight, inpWidth, grid_h, grid_w);image_path = "test_img/10.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();image = new Mat(image_path);dt1 = DateTime.Now;Mat img = new Mat();Cv2.Resize(image, img, new OpenCvSharp.Size(inpWidth, inpHeight));img.ConvertTo(img, MatType.CV_32FC3, 1.0f / 127.5f, -1.0f);BN_image = CvDnn.BlobFromImage(img);//配置图片输入数据opencv_net.SetInput(BN_image);//模型推理,读取推理结果Mat[] outs = new Mat[1] { new Mat() };string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames().ToArray();opencv_net.Forward(outs, outBlobNames);dt2 = DateTime.Now;float* offset = (float*)outs[0].Data;Mat tp = new Mat();Mat ori_mesh_np_x = new Mat();Mat ori_mesh_np_y = new Mat();Common.get_ori_rigid_mesh_tp(tp, ori_mesh_np_x, ori_mesh_np_y, offset, inpHeight, inpWidth, grid_h, grid_w);Mat T = W_inv * tp;   T = T.T();    Mat T_g = T * grid;Mat output_tps = Common._interpolate(BN_image, T_g, new OpenCvSharp.Size(inpWidth, inpHeight));Mat rectangling_np = (output_tps + 1) * 127.5;rectangling_np.ConvertTo(rectangling_np, MatType.CV_8UC3);Mat input_np = (img + 1) * 127.5;List<Mat> outputs = new List<Mat>();outputs.Add(rectangling_np);outputs.Add(input_np);outputs.Add(ori_mesh_np_x);outputs.Add(ori_mesh_np_y);Mat input_with_mesh = Common.draw_mesh_on_warp(outputs[1], outputs[2], outputs[3]);Cv2.CvtColor(outputs[0], outputs[0], ColorConversionCodes.BGR2RGB);Cv2.ImShow("mesh", input_with_mesh);result_image = outputs[0].Clone();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);}}
}

下载

源码下载

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

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

相关文章

CleanMyMac中文版2024破解完美版本下载链接

CleanMyMac中文版&#xff0c;是一款功能强大的系统优化软件。它能够帮助你清理垃圾文件、卸载无用应用、优化内存使用等&#xff0c;让你的电脑运行更加流畅稳定。 CleanMyMac中文版具有智能扫描功能&#xff0c;能够自动识别电脑上的垃圾文件和冗余数据。它能够快速扫描整个…

【MongoDB 新搭档 Kafka】

对于做过数据处理&#xff0c;使用过消息队列的小伙伴 &#xff0c;Kafka可以算是老朋友了&#xff0c;但是最近一个场景下&#xff0c;新的用法&#xff0c;让其变为了MongoDB的新搭档。 开始 从一个问题开始&#xff0c;熟悉MongoDB的小伙伴&#xff0c;可能使用过changeSt…

Java的三个接口Comparable,Comparator,Cloneable(浅拷贝与深拷贝)

Comparable 当我们要进行对象的比较的时候&#xff0c;我们是不能直接用>、< 这些符号直接进行比较的。 由于这是引用类型变量也是自定义类型变量&#xff0c;直接进行比较的时候&#xff0c;我们是通过对象的地址进行比较的&#xff0c;我们可以使用、! 进行两个对象的…

Spring Cloud 专题-前言篇(1)

引言 随着微服务架构的兴起&#xff0c;Spring Cloud 作为一套基于 Spring Boot 实现的云应用开发工具集&#xff0c;为开发者提供了在分布式系统&#xff08;如配置管理、服务发现、断路器、智能路由、微代理、控制总线等&#xff09;中快速构建一些常见模式的能力。本篇文档…

2024年大韩民国最佳品牌大赏 彭雨凡荣获“海外邀请特别奖”

14日&#xff0c;“2024年大韩民国最佳品牌大赏-韩流演艺大赏”颁奖典礼在韩国首尔永登浦区汝矣岛洞国会议员会馆第2会议室举办。 演员彭雨凡荣获“海外邀请特别奖”。 据悉&#xff0c;由大韩民国最佳品牌协会和世宗大王国民委员会&#xff08;理事长 LEE YUNTAE&#xff09…

关于IOMMU问题的扩展

关联CSDN&#xff1a; Steam Deck OLED WLAN下载速率过低问题的排查和解决-CSDN博客 前言 如前所述&#xff0c;Steam Deck OLED WLAN速率低问题和IOMMU有一定的关系&#xff0c;这里我们对IOMMU为什么会对速率有影响进行一个较深入的理解。 对于IOMMU我相信大家通过网上的…

Android中的Audio系统框架分析(一)

概述 Audio系统是Android 平台重要的组成部分&#xff0c;我们将从以下几个方面来讲解&#xff1a; 一Audio基础知识讲解 二、Android系统中Audio框架 Audio基础知识讲解 我们大家知道声音是由物体振动产生的声波。是通过介质&#xff08;空气或固体、液体&#xff09;传播并…

CrossOver Games For Mac官方下载_2024电脑最新版软件安装包下载

CrossOver Pro For Mac是由codewaver公司开发的类虚拟机软件&#xff0c;目的是使linux和Mac OS X操作系统和window系统兼容。CrossOver Pro For Mac能够直接在Mac上运行Windows软件与游戏&#xff0c;而不需虚拟机&#xff0c;功能是非常强大的&#xff0c;值得大家下载使用。…

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行 很喜欢的一段话&#xff1a;别想太多&#xff0c;好好生活&#xff0c;也许日子过着过着就会有答案&#xff0c;努力走着走着就会有温柔的着落。 春在路上&#xff0c;花在枝上&#xff0c;所有的美好都在路上&#xff…

【测试专题】系统测试报告(原件Word)

软件测试报告在软件开发过程中起着至关重要的作用&#xff0c;主要有以下几个主要原因&#xff1a; 1、确保软件质量 2、提供决策支持 3、记录测试过程和结果 4、促进沟通和协作 5、符合标准和法规要求 6、改进测试流程和策略 7、降低风险 软件开发全套资料获取进主页或者本文末…

IO流(二)

IO流&#xff08;二&#xff09; 目录 IO流 —— 字符流IO流 —— 缓冲流IO流 —— 转换流IO流 —— 打印流IO流 —— 数据流IO流 —— 序列化流 1.IO流 —— 字符流 文件字符输入流 —— 读字符数据进来 字节流&#xff1a;适合复制文件等&#xff0c;不适合读写文本文件字…

nginx rewrite地址重写

目录 常用的nginx正则表达式 location和rewrite的区别 一、location 1.location常用匹配类型 2.location匹配机制 3.实际工作中三大匹配规则 1.网站首页匹配 2.网站静态页面&#xff0c;通过前缀匹配或通用匹配在nginx服务器本地处理 3.网站动态页面&#xff0c;通过匹…

PostgreSQL源码分析——initdb

数据库初始化 在安装完数据库后&#xff0c;需要进行初始化数据库操作&#xff0c;对应PostgreSQL数据库中就是需要进行initdb后&#xff0c;才能对数据库进行启动。initdb的过程&#xff0c;其实就是创建数据库实例的过程&#xff0c;生成模板数据库和相应的目录、文件信息&a…

uniapp小程序限制微信群访问(图文教程)

我有一个微信小程序 “程序员实用资源” 我现在只想让我的微信群可以访问这个小程序的所有功能 所以我必须对我小程序的来源进行限制&#xff0c;让部分功能在正常访问的时候提示没有加群&#xff0c;不可访问&#xff0c;只有从群内点击进入小程序的时候才可以访问这部分功能…

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注&#xff0c;它通过识别和定位图像中的目标对象&#xff0c;提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为…

ESP32蓝牙串口通讯

文章目录 一、前言二、代码三、运行 一、前言 ESP32支持经典蓝牙和低功耗蓝牙&#xff08;BLE&#xff09;,经典蓝牙可在计算机上模拟出一个串口&#xff0c;使得ESP32可以以串口的方式和计算机通信。 二、代码 #include "BluetoothSerial.h"String device_name …

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精&#xff0c;以下是推荐的容易答辩的选题&#xff1a; SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…

软考中级证在手里,感觉白躺家里了?

软考中级&#xff0c;最适合考的专业是《系统集成项目管理工程师》&#xff0c;特别适合零基础的人&#xff01; 2022年中级职称的报名条件和要求非常宽松&#xff0c;即使没有学历、零基础和相关工作经验也可以考试&#xff01;&#xff01;&#xff01; 一、职称的含金量 …

docker 中 File Sharing 和Volumes 的区别

在 Docker 中&#xff0c;File Sharing 和 Volumes 都涉及到将文件和目录从主机系统映射到容器中&#xff0c;但它们的用途和实现方式有一些重要的区别&#xff1a; 一、简介 File Sharing 是 Docker Desktop 在 Windows 和 macOS 上的一项功能&#xff0c;允许你将主机文件系…

中国最厉害的改名大师颜廷利:食物的真正人生意义是识悟

在探索人生意义的深邃征途中&#xff0c;我们本应以“识悟”为航标&#xff0c;不断扬帆远航&#xff0c;以实现自我的升华。然而&#xff0c;当回望人世繁华&#xff0c;古往今来&#xff0c;无论男女老少&#xff0c;似乎都在“食物”的陪伴下&#xff0c;徘徊往复&#xff0…