博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#基于yolov3的行人检测
阅读量:4033 次
发布时间:2019-05-24

本文共 5841 字,大约阅读时间需要 19 分钟。

using System;using System.Collections.Generic;using System.Drawing;using System.IO;using System.Runtime.ExceptionServices;using System.Runtime.InteropServices;using System.Security;using System.Threading.Tasks;using System.Windows.Forms;using Emgu.CV;using Emgu.CV.CvEnum;using Emgu.CV.Structure;namespace WindowsFormsApp1{    public partial class Form1 : Form    {        private const string YoloLibraryName = @"D:\darknet-master (1)\darknet-master\build\darknet\x64\yolo_cpp_dll.dll";        private const int MaxObjects = 1000;        object ThreadLock = new object();        [DllImport(YoloLibraryName, EntryPoint = "init")]        private static extern int InitializeYolo(string configurationFilename, string weightsFilename, int gpu);        [DllImport(YoloLibraryName, EntryPoint = "detect_image")]         private static extern int DetectImage(uint width, uint height, byte[] pArray, int nSize, ref BboxContainer container);        //[DllImport(YoloLibraryName, EntryPoint = "adddd")]        //private static extern int adddd(int a, int b, ref int result, byte[] pArray);        [DllImport(YoloLibraryName, EntryPoint = "dispose")]        private static extern int DisposeYolo();        [StructLayout(LayoutKind.Sequential)]        public struct BboxContainer        {            [MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxObjects)]            public bbox_t[] candidates;        }        [StructLayout(LayoutKind.Sequential)]        public struct bbox_t        {            public UInt32 x, y, w, h;    // (x,y) - top-left corner, (w, h) - width & height of bounded box            public float prob;                 // confidence - probability that the object was found correctly            public UInt32 obj_id;        // class of object - from range [0, classes-1]            public UInt32 track_id;      // tracking id for video (0 - untracked, 1 - inf - tracked object)            public UInt32 frames_counter;        };        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            //Task.Run(() => InitYolo());            InitYolo();        }        public static void InitYolo()        {           InitializeYolo(                      Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "yolo-obj.cfg"),                      Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "yolo-obj_best.weights"),                      0);        }        [HandleProcessCorruptedStateExceptions]        [SecurityCritical]        public List
Detect(int Height, int Width, byte[] imageData) { var container = new BboxContainer(); var size = Marshal.SizeOf(imageData[0]) * imageData.Length; var pnt = Marshal.AllocHGlobal(size); try { Marshal.Copy(imageData, 0, pnt, imageData.Length); var count = DetectImage((uint)Width, (uint)Height, imageData, imageData.Length, ref container); if (count == -1) { throw new NotSupportedException(" has no OpenCV support"); } List
result = new List
(); for (int i = 0; i < count; i++) { result.Add(container.candidates[i]); } return result; } catch (Exception exception) { Console.WriteLine("Error : "); Console.WriteLine(exception.Message); return new List
(); } finally { // Free the unmanaged memory. Marshal.FreeHGlobal(pnt); //不释放内存会报错 } } private void button1_Click(object sender, EventArgs e) { //Image
img = new Image
(@"C:\Users\admin\source\repos\WindowsFormsApp1\WindowsFormsApp1\bin\x64\Debug\Camera20200421194241118.jpg"); Image
img1 = new Image
(@"Camera20200421194241118.jpg"); int Width, Height; Width = img1.Width; Height = img1.Height; while (Width % 4 != 0) { Width++; } CvInvoke.Resize(img1, img1, new Size(Width, Height), 0, 0, Inter.Lanczos4); Matrix
showImage = new Matrix
(img1.Height, img1.Width, 3); CvInvoke.CvtColor(img1, showImage, ColorConversion.Gray2Bgr); List
bboxes = new List
(); lock (ThreadLock) //锁线程 { int byte_size = showImage.Rows * showImage.Cols * 3; byte[] img_data_in = new byte[byte_size]; Array.Copy(showImage.Mat.GetData(), img_data_in, byte_size); //bboxes = Detect(showImage.Height, showImage.Width, img_data_in);//方法一 bboxes = Detect(showImage.Height, showImage.Width, showImage.Bytes);//方法二 } if (bboxes.ToArray().Length != 0) { //MessageBox.Show("1111"); } foreach (var bbox in bboxes) { var color_red = new MCvScalar(0, 0, 255); // BGR var color_green = new MCvScalar(0, 255, 0); var color_yellow = new MCvScalar(0, 255, 255); Rectangle rect = new Rectangle((int)bbox.x, (int)bbox.y, (int)bbox.w, (int)bbox.h); if (bbox.obj_id == 0) { CvInvoke.Rectangle(showImage, rect, color_yellow); } else if (bbox.obj_id == 2) { CvInvoke.Rectangle(showImage, rect, color_green); } else { CvInvoke.Rectangle(showImage, rect, color_red); } } pictureBox1.Image = showImage.Mat.Bitmap; } }}

运行结果:

yolo_cpp_dll中的yolo_v2_class.cpp需要修改下构造函数detect_image

int detect_image(unsigned int width, unsigned int height, unsigned char* data, const size_t data_length, bbox_t_container &container){    cv::Mat image = cv::Mat(height, width, CV_8UC3, data, 3 * width);    //cv::imshow("test_img", image);    //cv::waitKey(1);    std::vector
detection = detector->detect(image); for (size_t i = 0; i < detection.size() && i < C_SHARP_MAX_OBJECTS; ++i) container.candidates[i] = detection[i]; return detection.size();;}

转载地址:http://goydi.baihongyu.com/

你可能感兴趣的文章
uboot.lds文件分析
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
flex中设置Label标签文字的自动换行
查看>>
Flex 中的元数据标签
查看>>
flex4 中创建自定义弹出窗口
查看>>
01Java基础语法-11. 数据类型之间的转换
查看>>
01Java基础语法-13. if分支语句的灵活使用
查看>>
01Java基础语法-15.for循环结构
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-17. do..while循环结构
查看>>
01Java基础语法-18. 各种循环语句的区别和应用场景
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>