赞
踩
目录
C# OpenCvSharp DNN Image Retouching
github地址:https://github.com/hejingwenhejingwen/CSRNet
(ECCV 2020) Conditional Sequential Modulation for Efficient Global Image Retouching
Model Properties
-------------------------
---------------------------------------------------------------
Inputs
-------------------------
name:input
tensor:Float[1, 3, 360, 640]
---------------------------------------------------------------
Outputs
-------------------------
name:output
tensor:Float[1, 3, 360, 640]
---------------------------------------------------------------
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;
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)
{
modelpath = "model/csrnet_360x640.onnx";
inpHeight = 360;
inpWidth = 640;
opencv_net = CvDnn.ReadNetFromOnnx(modelpath);
image_path = "test_img/0014.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);
int srch = image.Rows;
int srcw = image.Cols;
BN_image = CvDnn.BlobFromImage(image, 1 / 255.0, new OpenCvSharp.Size(inpWidth, inpHeight), new Scalar(0, 0, 0), true, false);
//配置图片输入数据
opencv_net.SetInput(BN_image);
//模型推理,读取推理结果
Mat[] outs = new Mat[1] { new Mat() };
string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames().ToArray();
dt1 = DateTime.Now;
opencv_net.Forward(outs, outBlobNames);
dt2 = DateTime.Now;
float* pdata = (float*)outs[0].Data;
int out_h = outs[0].Size(2);
int out_w = outs[0].Size(3);
int channel_step = out_h * out_w;
float[] data = new float[channel_step * 3];
for (int i = 0; i < data.Length; i++)
{
data[i] = pdata[i] * 255;
if (data[i] < 0)
{
data[i] = 0;
}
else if (data[i] > 255)
{
data[i] = 255;
}
}
float[] temp_r = new float[out_h * out_w];
float[] temp_g = new float[out_h * out_w];
float[] temp_b = new float[out_h * out_w];
Array.Copy(data, temp_r, out_h * out_w);
Array.Copy(data, out_h * out_w, temp_g, 0, out_h * out_w);
Array.Copy(data, out_h * out_w * 2, temp_b, 0, out_h * out_w);
Mat rmat = new Mat(out_h, out_w, MatType.CV_32F, temp_r);
Mat gmat = new Mat(out_h, out_w, MatType.CV_32F, temp_g);
Mat bmat = new Mat(out_h, out_w, MatType.CV_32F, temp_b);
result_image = new Mat();
Cv2.Merge(new Mat[] { bmat, gmat, rmat }, result_image);
Cv2.Resize(result_image, result_image, new OpenCvSharp.Size(srcw, srch));
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;
-
- 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)
- {
- modelpath = "model/csrnet_360x640.onnx";
-
- inpHeight = 360;
- inpWidth = 640;
-
- opencv_net = CvDnn.ReadNetFromOnnx(modelpath);
-
- image_path = "test_img/0014.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);
-
- int srch = image.Rows;
- int srcw = image.Cols;
-
-
- BN_image = CvDnn.BlobFromImage(image, 1 / 255.0, new OpenCvSharp.Size(inpWidth, inpHeight), new Scalar(0, 0, 0), true, false);
-
- //配置图片输入数据
- opencv_net.SetInput(BN_image);
-
- //模型推理,读取推理结果
- Mat[] outs = new Mat[1] { new Mat() };
- string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames().ToArray();
-
- dt1 = DateTime.Now;
-
- opencv_net.Forward(outs, outBlobNames);
-
- dt2 = DateTime.Now;
-
- float* pdata = (float*)outs[0].Data;
- int out_h = outs[0].Size(2);
- int out_w = outs[0].Size(3);
- int channel_step = out_h * out_w;
- float[] data = new float[channel_step * 3];
- for (int i = 0; i < data.Length; i++)
- {
- data[i] = pdata[i] * 255;
-
- if (data[i] < 0)
- {
- data[i] = 0;
- }
- else if (data[i] > 255)
- {
- data[i] = 255;
- }
- }
-
- float[] temp_r = new float[out_h * out_w];
- float[] temp_g = new float[out_h * out_w];
- float[] temp_b = new float[out_h * out_w];
-
- Array.Copy(data, temp_r, out_h * out_w);
- Array.Copy(data, out_h * out_w, temp_g, 0, out_h * out_w);
- Array.Copy(data, out_h * out_w * 2, temp_b, 0, out_h * out_w);
-
- Mat rmat = new Mat(out_h, out_w, MatType.CV_32F, temp_r);
- Mat gmat = new Mat(out_h, out_w, MatType.CV_32F, temp_g);
- Mat bmat = new Mat(out_h, out_w, MatType.CV_32F, temp_b);
-
- result_image = new Mat();
- Cv2.Merge(new Mat[] { bmat, gmat, rmat }, result_image);
-
- Cv2.Resize(result_image, result_image, new OpenCvSharp.Size(srcw, srch));
-
- 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);
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。