C# E2Pose人体关键点检测(OpenVINO推理)
目录
效果
模型信息
Inputs
-------------------------
name:inputimg
tensor:Float[1, 3, 512, 512]
---------------------------------------------------------------
Outputs
-------------------------
name:kvxy/concat
tensor:Float[1, 341, 17, 3]
name:pv/concat
tensor:Float[1, 341, 1, 1]
---------------------------------------------------------------
项目
代码
using OpenCvSharp;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace OpenVINO_Demo
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
string imgFilter = "图片|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
E2Pose e2Pose;
Mat image;
string image_path = "";
string model_path;
string video_path = "";
string videoFilter = "视频|*.mp4;*.avi";
VideoCapture vcapture;
VideoWriter vwriter;
bool saveDetVideo = false;
///
/// 单图推理
///
///
///
private void button2_Click(object sender, EventArgs e)
{
if (image_path == "")
{
return;
}
button2.Enabled = false;
pictureBox2.Image = null;
textBox1.Text = "";
Application.DoEvents();
image = new Mat(image_path);
Mat result_image = image.Clone();
e2Pose.Detect(result_image);
if (pictureBox2.Image != null)
{
pictureBox2.Image.Dispose();
}
pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
textBox1.Text = e2Pose.DetectTime();
button2.Enabled = true;
}
///
/// 窗体加载,初始化
///
///
///
private void Form1_Load(object sender, EventArgs e)
{
image_path = "test/1.jpg";
pictureBox1.Image = new Bitmap(image_path);
model_path = "model/e2epose_resnet50_1x3x512x512.onnx";
e2Pose = new E2Pose(model_path);
}
///
/// 选择图片
///
///
///
private void button1_Click_1(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = imgFilter;
if (ofd.ShowDialog() != DialogResult.OK) return;
pictureBox1.Image = null;
image_path = ofd.FileName;
pictureBox1.Image = new Bitmap(image_path);
textBox1.Text = "";
pictureBox2.Image = null;
}
///
/// 选择视频
///
///
///
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = videoFilter;
ofd.InitialDirectory = Application.StartupPath + "\\test";
if (ofd.ShowDialog() != DialogResult.OK) return;
video_path = ofd.FileName;
textBox1.Text = video_path;
}
///
/// 视频推理
///
///
///
private void button3_Click(object sender, EventArgs e)
{
if (video_path == "")
{
MessageBox.Show("请先选择视频!");
return;
}
textBox1.Text = "开始检测";
Application.DoEvents();
Thread thread = new Thread(new ThreadStart(VideoDetection));
thread.Start();
thread.Join();
textBox1.Text = "检测完成!";
}
void VideoDetection()
{
vcapture = new VideoCapture(video_path);
if (!vcapture.IsOpened())
{
MessageBox.Show("打开视频文件失败");
return;
}
Mat frame = new Mat();
// 获取视频的fps
double videoFps = vcapture.Get(VideoCaptureProperties.Fps);
// 计算等待时间(毫秒)
int delay = (int)(1000 / videoFps);
Stopwatch _stopwatch = new Stopwatch();
if (checkBox1.Checked)
{
vwriter = new VideoWriter("out.mp4", FourCC.X264, vcapture.Fps, new OpenCvSharp.Size(vcapture.FrameWidth, vcapture.FrameHeight));
saveDetVideo = true;
}
else
{
saveDetVideo = false;
}
Cv2.NamedWindow("DetectionResult 按下ESC,退出", WindowFlags.Normal);
Cv2.ResizeWindow("DetectionResult 按下ESC,退出", vcapture.FrameWidth, vcapture.FrameHeight);
while (vcapture.Read(frame))
{
if (frame.Empty())
{
MessageBox.Show("读取失败");
return;
}
_stopwatch.Restart();
delay = (int)(1000 / videoFps);
e2Pose.Detect(frame);
Cv2.PutText(frame, "preprocessTime:" + e2Pose.preprocessTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 30), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
Cv2.PutText(frame, "inferTime:" + e2Pose.inferTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 70), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
Cv2.PutText(frame, "postprocessTime:" + e2Pose.postprocessTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 110), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
Cv2.PutText(frame, "totalTime:" + e2Pose.totalTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 150), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
Cv2.PutText(frame, "video fps:" + videoFps.ToString("F2"), new OpenCvSharp.Point(10, 190), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
Cv2.PutText(frame, "det fps:" + e2Pose.detFps.ToString("F2"), new OpenCvSharp.Point(10, 230), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
if (saveDetVideo)
{
vwriter.Write(frame);
}
Cv2.ImShow("DetectionResult 按下ESC,退出", frame);
// for test
// delay = 1;
delay = (int)(delay - _stopwatch.ElapsedMilliseconds);
if (delay <= 0)
{
delay = 1;
}
//Console.WriteLine("delay:" + delay.ToString()) ;
if (Cv2.WaitKey(delay) == 27 || Cv2.GetWindowProperty("DetectionResult 按下ESC,退出", WindowPropertyFlags.Visible) < 1.0)
{
Cv2.DestroyAllWindows();
vcapture.Release();
break;
}
}
Cv2.DestroyAllWindows();
vcapture.Release();
if (saveDetVideo)
{
vwriter.Release();
}
}
private void button5_Click(object sender, EventArgs e)
{
if (video_path == "")
{
MessageBox.Show("请先选择视频!");
return;
}
button5.Enabled = false;
textBox1.Text = "开始检测";
Application.DoEvents();
Task task = new Task(() =>
{
VideoCapture vcapture = new VideoCapture(video_path);
if (!vcapture.IsOpened())
{
MessageBox.Show("打开视频文件失败");
return;
}
E2Pose2 e2Pose2 = new E2Pose2(model_path);
Mat frame = new Mat();
// 获取视频的fps
double videoFps = vcapture.Get(VideoCaptureProperties.Fps);
// 计算等待时间(毫秒)
int delay = (int)(1000 / videoFps);
Stopwatch _stopwatch = new Stopwatch();
Cv2.NamedWindow("DetectionResult 按下ESC,退出", WindowFlags.Normal);
Cv2.ResizeWindow("DetectionResult 按下ESC,退出", vcapture.FrameWidth * 2, vcapture.FrameHeight);
while (vcapture.Read(frame))
{
if (frame.Empty())
{
MessageBox.Show("读取失败");
return;
}
_stopwatch.Restart();
delay = (int)(1000 / videoFps);
Mat result = e2Pose2.Detect(frame);
Cv2.ImShow("DetectionResult 按下ESC,退出", result);
// for test
// delay = 1;
delay = (int)(delay - _stopwatch.ElapsedMilliseconds);
if (delay <= 0)
{
delay = 1;
}
//Console.WriteLine("delay:" + delay.ToString()) ;
// 如果按下ESC或点击关闭,退出循环
if (Cv2.WaitKey(delay) == 27 || Cv2.GetWindowProperty("DetectionResult 按下ESC,退出", WindowPropertyFlags.Visible) < 1.0)
{
Cv2.DestroyAllWindows();
vcapture.Release();
break;
}
}
Cv2.DestroyAllWindows();
vcapture.Release();
textBox1.Invoke(new Action(() =>
{
textBox1.Text = "检测结束!";
button5.Enabled = true; ;
}));
});
task.Start();
}
//保存
SaveFileDialog sdf = new SaveFileDialog();
private void button6_Click(object sender, EventArgs e)
{
if (pictureBox2.Image == null)
{
return;
}
Bitmap output = new Bitmap(pictureBox2.Image);
sdf.Title = "保存";
sdf.Filter = "Images (*.jpg)|*.jpg|Images (*.png)|*.png|Images (*.bmp)|*.bmp";
if (sdf.ShowDialog() == DialogResult.OK)
{
switch (sdf.FilterIndex)
{
case 1:
{
output.Save(sdf.FileName, ImageFormat.Jpeg);
break;
}
case 2:
{
output.Save(sdf.FileName, ImageFormat.Png);
break;
}
case 3:
{
output.Save(sdf.FileName, ImageFormat.Bmp);
break;
}
}
MessageBox.Show("保存成功,位置:" + sdf.FileName);
}
}
}
}
- using OpenCvSharp;
- using System;
- using System.Diagnostics;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
-
- namespace OpenVINO_Demo
- {
- public partial class Form2 : Form
- {
- public Form2()
- {
- InitializeComponent();
- }
-
- string imgFilter = "图片|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
-
- E2Pose e2Pose;
- Mat image;
-
- string image_path = "";
- string model_path;
-
- string video_path = "";
- string videoFilter = "视频|*.mp4;*.avi";
- VideoCapture vcapture;
- VideoWriter vwriter;
- bool saveDetVideo = false;
-
- /// <summary>
- /// 单图推理
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void button2_Click(object sender, EventArgs e)
- {
-
- if (image_path == "")
- {
- return;
- }
-
- button2.Enabled = false;
- pictureBox2.Image = null;
- textBox1.Text = "";
-
- Application.DoEvents();
-
- image = new Mat(image_path);
-
- Mat result_image = image.Clone();
- e2Pose.Detect(result_image);
-
- if (pictureBox2.Image != null)
- {
- pictureBox2.Image.Dispose();
- }
- pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
- textBox1.Text = e2Pose.DetectTime();
-
- button2.Enabled = true;
-
- }
-
- /// <summary>
- /// 窗体加载,初始化
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Form1_Load(object sender, EventArgs e)
- {
- image_path = "test/1.jpg";
- pictureBox1.Image = new Bitmap(image_path);
-
- model_path = "model/e2epose_resnet50_1x3x512x512.onnx";
-
- e2Pose = new E2Pose(model_path);
- }
-
- /// <summary>
- /// 选择图片
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void button1_Click_1(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- ofd.Filter = imgFilter;
- if (ofd.ShowDialog() != DialogResult.OK) return;
-
- pictureBox1.Image = null;
-
- image_path = ofd.FileName;
- pictureBox1.Image = new Bitmap(image_path);
-
- textBox1.Text = "";
- pictureBox2.Image = null;
- }
-
- /// <summary>
- /// 选择视频
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void button4_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- ofd.Filter = videoFilter;
- ofd.InitialDirectory = Application.StartupPath + "\\test";
- if (ofd.ShowDialog() != DialogResult.OK) return;
-
- video_path = ofd.FileName;
-
- textBox1.Text = video_path;
- }
-
- /// <summary>
- /// 视频推理
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void button3_Click(object sender, EventArgs e)
- {
- if (video_path == "")
- {
- MessageBox.Show("请先选择视频!");
- return;
- }
-
- textBox1.Text = "开始检测";
-
- Application.DoEvents();
-
- Thread thread = new Thread(new ThreadStart(VideoDetection));
-
- thread.Start();
- thread.Join();
-
- textBox1.Text = "检测完成!";
- }
-
- void VideoDetection()
- {
- vcapture = new VideoCapture(video_path);
- if (!vcapture.IsOpened())
- {
- MessageBox.Show("打开视频文件失败");
- return;
- }
-
-
- Mat frame = new Mat();
-
- // 获取视频的fps
- double videoFps = vcapture.Get(VideoCaptureProperties.Fps);
- // 计算等待时间(毫秒)
- int delay = (int)(1000 / videoFps);
- Stopwatch _stopwatch = new Stopwatch();
-
- if (checkBox1.Checked)
- {
- vwriter = new VideoWriter("out.mp4", FourCC.X264, vcapture.Fps, new OpenCvSharp.Size(vcapture.FrameWidth, vcapture.FrameHeight));
- saveDetVideo = true;
- }
- else
- {
- saveDetVideo = false;
- }
-
- Cv2.NamedWindow("DetectionResult 按下ESC,退出", WindowFlags.Normal);
- Cv2.ResizeWindow("DetectionResult 按下ESC,退出", vcapture.FrameWidth, vcapture.FrameHeight);
-
- while (vcapture.Read(frame))
- {
- if (frame.Empty())
- {
- MessageBox.Show("读取失败");
- return;
- }
-
- _stopwatch.Restart();
-
- delay = (int)(1000 / videoFps);
-
- e2Pose.Detect(frame);
-
- Cv2.PutText(frame, "preprocessTime:" + e2Pose.preprocessTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 30), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
- Cv2.PutText(frame, "inferTime:" + e2Pose.inferTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 70), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
- Cv2.PutText(frame, "postprocessTime:" + e2Pose.postprocessTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 110), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
- Cv2.PutText(frame, "totalTime:" + e2Pose.totalTime.ToString("F2") + "ms", new OpenCvSharp.Point(10, 150), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
- Cv2.PutText(frame, "video fps:" + videoFps.ToString("F2"), new OpenCvSharp.Point(10, 190), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
- Cv2.PutText(frame, "det fps:" + e2Pose.detFps.ToString("F2"), new OpenCvSharp.Point(10, 230), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
-
- if (saveDetVideo)
- {
- vwriter.Write(frame);
- }
-
- Cv2.ImShow("DetectionResult 按下ESC,退出", frame);
-
- // for test
- // delay = 1;
- delay = (int)(delay - _stopwatch.ElapsedMilliseconds);
- if (delay <= 0)
- {
- delay = 1;
- }
- //Console.WriteLine("delay:" + delay.ToString()) ;
- if (Cv2.WaitKey(delay) == 27 || Cv2.GetWindowProperty("DetectionResult 按下ESC,退出", WindowPropertyFlags.Visible) < 1.0)
- {
- Cv2.DestroyAllWindows();
- vcapture.Release();
- break;
- }
- }
-
- Cv2.DestroyAllWindows();
- vcapture.Release();
- if (saveDetVideo)
- {
- vwriter.Release();
- }
-
- }
-
- private void button5_Click(object sender, EventArgs e)
- {
- if (video_path == "")
- {
- MessageBox.Show("请先选择视频!");
- return;
- }
- button5.Enabled = false;
- textBox1.Text = "开始检测";
- Application.DoEvents();
-
- Task task = new Task(() =>
- {
- VideoCapture vcapture = new VideoCapture(video_path);
- if (!vcapture.IsOpened())
- {
- MessageBox.Show("打开视频文件失败");
- return;
- }
-
- E2Pose2 e2Pose2 = new E2Pose2(model_path);
-
- Mat frame = new Mat();
-
- // 获取视频的fps
- double videoFps = vcapture.Get(VideoCaptureProperties.Fps);
- // 计算等待时间(毫秒)
- int delay = (int)(1000 / videoFps);
- Stopwatch _stopwatch = new Stopwatch();
-
- Cv2.NamedWindow("DetectionResult 按下ESC,退出", WindowFlags.Normal);
- Cv2.ResizeWindow("DetectionResult 按下ESC,退出", vcapture.FrameWidth * 2, vcapture.FrameHeight);
-
- while (vcapture.Read(frame))
- {
- if (frame.Empty())
- {
- MessageBox.Show("读取失败");
- return;
- }
-
- _stopwatch.Restart();
-
- delay = (int)(1000 / videoFps);
-
- Mat result = e2Pose2.Detect(frame);
-
- Cv2.ImShow("DetectionResult 按下ESC,退出", result);
-
- // for test
- // delay = 1;
- delay = (int)(delay - _stopwatch.ElapsedMilliseconds);
- if (delay <= 0)
- {
- delay = 1;
- }
- //Console.WriteLine("delay:" + delay.ToString()) ;
- // 如果按下ESC或点击关闭,退出循环
- if (Cv2.WaitKey(delay) == 27 || Cv2.GetWindowProperty("DetectionResult 按下ESC,退出", WindowPropertyFlags.Visible) < 1.0)
- {
- Cv2.DestroyAllWindows();
- vcapture.Release();
- break;
- }
- }
-
- Cv2.DestroyAllWindows();
- vcapture.Release();
-
- textBox1.Invoke(new Action(() =>
- {
- textBox1.Text = "检测结束!";
- button5.Enabled = true; ;
-
- }));
-
- });
- task.Start();
-
- }
-
- //保存
- SaveFileDialog sdf = new SaveFileDialog();
- private void button6_Click(object sender, EventArgs e)
- {
- if (pictureBox2.Image == null)
- {
- return;
- }
- Bitmap output = new Bitmap(pictureBox2.Image);
- sdf.Title = "保存";
- sdf.Filter = "Images (*.jpg)|*.jpg|Images (*.png)|*.png|Images (*.bmp)|*.bmp";
- if (sdf.ShowDialog() == DialogResult.OK)
- {
- switch (sdf.FilterIndex)
- {
- case 1:
- {
- output.Save(sdf.FileName, ImageFormat.Jpeg);
- break;
- }
- case 2:
- {
- output.Save(sdf.FileName, ImageFormat.Png);
- break;
- }
- case 3:
- {
- output.Save(sdf.FileName, ImageFormat.Bmp);
- break;
- }
- }
- MessageBox.Show("保存成功,位置:" + sdf.FileName);
- }
-
- }
-
- }
-
- }
下载


评论记录:
回复评论: