• Emgu CV4图像处理之打开Tensorflow训练模型17(C#)


    本文测试环境:

    win10  64位

    vistual studio 2019  

    Emgu CV 4.6.0

    环境配置准备:

    1 新增控制台项目,.net framework为4.7.2

    2  把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下

    3  项目选择x64

    4 添加项目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll  

    具体配置参考:
    Emgu CV4图像处理之环境搭建1(C#)_zxy2847225301的博客-CSDN博客

    Tensorflow模型下载链接(Tensorflow模型太难找了,找了一圈才找到这个,免积分下载,如果csdn自动调整了该资源的积分,请联系我,我这边修改回0积分):

    https://download.csdn.net/download/zxy13826134783/86954448

    把下载的文件,解压后,全部复制到项目的Debug目录下

    中文的找了一圈都没有找到EmguCV操作tensorflow模型的,幸好在stack overflow中找到了,参考链接如下:

    c# - How to detect custom object using EmguCV - Stack Overflow

    c++写的参考链接:

    OpenCV调用TensorFlow预训练模型_AI吃大瓜的博客-CSDN博客_opencv tensorflow

    打开Tensorflow模型函数原型为:

    DnnInvoke.ReadNetFromTensorflow(string model,[string config = null])

    第一个参数model为pb模型文件路径

    第二个参数config为配置文件路径,可选

    程序中测试的原图如下:

    street.png

    cat1.png

    cat2.png

    cat3.png

    参考代码如下:

    1. using Emgu.CV;
    2. using Emgu.CV.Dnn;
    3. using Emgu.CV.Structure;
    4. using Emgu.CV.Util;
    5. using System;
    6. using System.Collections.Generic;
    7. using System.Drawing;
    8. using System.IO;
    9. using System.Linq;
    10. using System.Text;
    11. using System.Threading.Tasks;
    12. namespace EmguCVDemo2
    13. {
    14. class Program
    15. {
    16. static void Main(string[] args)
    17. {
    18. OpenTensorflowModel("street.png", "frozen_inference_graph.pb", "ssd_inception_v2_coco_2017_11_17.pbtxt");
    19. CvInvoke.WaitKey(0);
    20. Console.ReadLine();
    21. }
    22. ///
    23. /// 打开Tensorflow模型
    24. ///
    25. private static void OpenTensorflowModel(string imgFileName, string pbFileName, string configFileName)
    26. {
    27. using (Imagebyte> image1 = new Imagebyte>(imgFileName))
    28. {
    29. int interception = 0;
    30. int cols = image1.Width;
    31. int rows = image1.Height;
    32. Net netcfg = DnnInvoke.ReadNetFromTensorflow(pbFileName, configFileName);//(Directory.GetCurrentDirectory() + @"\fldr\CO.pb", Directory.GetCurrentDirectory() + @"\fldr\graph.pbtxt");
    33. netcfg.SetInput(DnnInvoke.BlobFromImage(image1.Mat, 1, new System.Drawing.Size(300, 300), default(MCvScalar), true, false));
    34. Mat mat = netcfg.Forward();
    35. #region mat.GetData()返回的类型要根据模型的实践情况来,后面的解析识别结果也会不一样
    36. float[,,,] flt = (float[,,,])mat.GetData();
    37. string[] getMessage = {"Index0", "man", "Index2", "car","Index4", "Index5", "Index6", "Index7", "Index8"
    38. ,"Index9", "light", "Index11", "Index12", "Index13"
    39. ,"Index14", "Index15", "Index16", "cat", "Index18"
    40. ,"Index19", "Index20", "Index21", "Index22", "Index23"};
    41. for (int x = 0; x < flt.GetLength(2); x++)
    42. {
    43. //分值大于0.9
    44. if (flt[0, 0, x, 2] > 0.9)
    45. {
    46. int left = Convert.ToInt32(flt[0, 0, x, 3] * cols);
    47. int top = Convert.ToInt32(flt[0, 0, x, 4] * rows);
    48. int right = Convert.ToInt32(flt[0, 0, x, 5] * cols);
    49. int bottom = Convert.ToInt32(flt[0, 0, x, 6] * rows);
    50. Console.WriteLine("分值:" + flt[0, 0, x, 2] + " 下标:" + flt[0, 0, x, 1]);
    51. int index = (int)flt[0, 0, x, 1];
    52. if (index < 23)
    53. {
    54. CvInvoke.PutText(image1, getMessage[index], new Point((left + right) / 2, (top + bottom) / 2), Emgu.CV.CvEnum.FontFace.HersheySimplex, 1, new MCvScalar(0, 0, 255));
    55. }
    56. image1.Draw(new Rectangle(left, top, right - left, bottom - top), new Bgr(0, 0, 255), 2);
    57. }
    58. }
    59. #endregion
    60. CvInvoke.Imshow("image1", image1);
    61. image1.Save("testing-1.png");
    62. }
    63. }
    64. }
    65. }

    经过多方测试,发现flt[0, 0, x, 1]是识别结果信息,flt[0, 0, x, 2]为识别的分值;getMessage 中的信息要自己试了,我试了人、猫、汽车

    运行结果:

    把代码中的street.png换成cat1.png,运行结果如下:

     再换成cat2.png后运行结果如下:

    再换成cat3.png后运行结果如下:

  • 相关阅读:
    环形石子合并——区间DP
    接口隔离原则(Interface Segregation Principle)
    使用 ADB 命令在 Android 设备上进行截屏
    java-php-net-python-放心花投资理财网系统计算机毕业设计程序
    View 自定义 - 坐标系、位置获取
    HTML+CSS画一个卡通中秋月饼
    手机有什么爬虫App工具?
    社区服务用工具建立与居民的强关系
    超级适合小白!学Java必读书籍,强烈推荐
    MySql的开发环境
  • 原文地址:https://blog.csdn.net/zxy13826134783/article/details/127805911