当前位置: 首页 > news >正文

吉林品牌网站建设商家小米网站seo分析报告+书

吉林品牌网站建设商家,小米网站seo分析报告+书,wordpress同时上传多个文件,陕西省建设厅网站安全员报名OpenCV是一个基于Apache2.0许可#xff08;开源#xff09;发行的跨平台计算机视觉和机器学习软件库#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成#xff0c;同时提供了Python、Ruby、MATLAB等语…   OpenCV是一个基于Apache2.0许可开源发行的跨平台计算机视觉和机器学习软件库可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成同时提供了Python、Ruby、MATLAB等语言的接口实现了图像处理和计算机视觉方面的很多通用算法。   OpenCvSharp 是一个OpenCV的.Net wrapper应用最新的OpenCV库开发使用习惯比EmguCV更接近原始的OpenCV有详细的使用样例供参考。该库采用LGPL发行对商业应用友好。使用OpenCvSharp可用C#VB.NET等语言实现多种流行的图像处理(image processing)与计算机视觉(computer vision)算法。   但是在实际使用中由于涉及到不同编程语言之间互相调用导致C 中的OpenCV与C#中的OpenCvSharp 图像数据在不同编程语言之间难以有效传递。在本文中我们将结合OpenCvSharp源码实现原理探究两种数据之间的通信方式。 1. 问题分析 在日常开发中由于一些库不支持C#接口因此在使用时我们需要借助动态链接库的方式在C#中调用C封装的应用。由于C与C#底层编译方式不同因此动态链接库只可以传递基础的数据类型无法传递像Class这种高级的数据格式。 在日常开发中我们在C#中使用OpenCvSharp进行图像处理但是我们调用的算法是通过C封装的动态链接库且需要将图片数据传递到C封装的动态链接库中进行处理因此实现高效的实现图片数据传递是十分有必要的。常见的方式有两种 1第一种方式是在C#中将图片数据转为基本数据类型byte[]数组然后将该数据传递到C动态链接库中在接收到该数据后由C再将该数据重新转为图片数据进行处理。目前该方式经过测试是可以实现的但是这样有一个弊端图片数据需要进行两次的转换这样会导致严重浪费时间和消耗大量内存。 2第二种方式是在C#中将数据保存到本地然后再C动态链接库中读取。与上一种方式一样这样会导致严重浪费时间和消耗大量内存。 2. 解决办法 为了解决这个问题我们探究了一下OpenCvSharp 实现方式通过其源码可知OpenCvSharp 在实现时是通过对C中的OpenCV进行了进一步封装将Mat数据定义成指针类型然后以指针的方式在C与C#中进行传递而在C#中重新定义了Mat数据类型将C传递来的Mat指针作为成员变量进行初始化而后续基于Mat的所有操作其低层都是通过传递这个指针进行操作的。 知道了Mat的这个数据类型的实现原理后我们可以模仿这种方式以指针的方式实现将OpenCvSharp的数据传递到OpenCV C中这样就可以快速实现数据类型传递。实现方式如下图所示。 在C#中使用OpenCvSharp获取一个图片数据数据类型为Mat我们可以先进行处理等操作接下来我们可以获取OpenCvSharp的地址CvPtr然后在C中使用*Mat指针进行获取然后通过*Mat我们便可以获取到OpenCV C中的Mat数据。接下来用户就可以根据自己的需求进行处理即可。在处理完成后在将获得新的用Mat数据转为用*Mat指针然后再C#中使用IntPtr数据类型进行接收然后使用OpenCvSharp的Mat以获取的指针数据为初始值初始化Mat数据类型即获得新的Mat数据。 通过上述方式我们便可以很轻松的实现C#中的OpenCvSharp与C中的OpenCv数据转换。 3. 项目创建 为方便演示下述所有程序设计与编译皆是在Windows11环境下使用Visual Studio 2022编辑器实现。 OpenCV: 4.8.0OpenCvSharp: 4.9.0 大家可以根据上述版本进行配置也可以使用其他版本配置但要保证OpenCV与OpenCvSharp都是同一个基础版本的且版本差别不要太大。 3.1 创建C项目 使用Visual Studio 2022创建一个空的C项目然后添加两个文件分别为mat_conv.h、mat_conv.cpp。 接下来配置项目属性首先配置项目输出类型如下图所示设置图片输出类型为动态库(.dll) 然后配置OpenCV C项目依赖主要是配置C项目的包含目录、库目录以及附加依赖项三个地方如下图所示 以下是我的项目设置信息大家可以根据自己安装的OpenCV情况进行设置 包含目录: C:\3rdpartylib\opencv\build\include 库目录: C:\3rdpartylib\opencv\build\x64\vc16\lib 附加依赖项: opencv_world480.lib3.2 创建C#项目 使用Visual Studio 2022创建一个新的C#控制台项目然后使用NuGet安装所需的程序集即可此处只需要安装OpenCvSharp即可如下图所示 4. 接口测试 此处主要测试四个接口 第一个接口测试在OpenCvSharp中读取一张图片然后将图片数据传入到OpenCV中测试传入是否成功。第二个测试接口在OpenCV创建一个图片绘制一个矩形然后将创建好的图片传出到OpenCvSharp测试传出数据是否成功。第三个测试接口是在OpenCvSharp中读取一张图片然后将图片数据传入到OpenCV中并进行一步处理该处理结果会将数据保存到另一个新的图片数据中将该新的图片数据传出然后在OpenCvSharp查看是否处理成功测试该过程是否成功。第四个测试接口是在OpenCvSharp中读取一张图片然后将图片数据传入到OpenCV中并进行一步处理该处理结果会直接在原有数据上进行修改然后在OpenCvSharp查看是否处理成功测试该过程是否成功。 4.1 接口一测试 在以下文件中分别添加以下代码 mat_conv.h #include opencv2/opencv.hpp extern C __declspec(dllexport) void __stdcall mat_conv1(cv::Mat * mat);mat_conv.cpp #include mat_conv.hvoid mat_conv1(cv::Mat *mat) {cv::imshow(image, *mat);cv::waitKey(0); }Program.cs using OpenCvSharp; using OpenCvSharp.Internal; using System.Runtime.InteropServices; namespace opencv_csharp {internal class Program{static void Main(string[] args){Console.WriteLine(Hello, World!);string image_path image.jpg;Mat mat1 Cv2.ImRead(image_path);Methord.mat_conv1(mat1.CvPtr);}}class Methord {private const string dll_path C:\\Users\\lenovo\\Desktop\\test_opencv\\x64\\Release\\opencv_cpp.dll;[DllImport(dll_path, CharSet CharSet.Unicode, CallingConvention CallingConvention.Cdecl)]public static extern void mat_conv1(IntPtr mat);} }其中mat_conv.h、mat_conv.cpp为C项目文件Program.cs文件为C#项目文件。 在C项目文件中extern C __declspec(dllexport)表示使用C语言的编译方式进行编译并导出到dll中。 mat_conv1(cv::Mat * mat)方法主要是接受传入的Mat指针并使用cv::imshow(image, *mat)将图片数据展示出来。 在C#项目中使用[DllImport]属性将动态链接库中的mat_conv1读取出来同时因为在C#中指针都是被封装为IntPtr类型的因此使用IntPtr表示此处传入的参数为指针类型。在使用该接口时直接调用该方法并且传入指针参数该指针参数可以通过Mat.CvPtr直接获得。 如下图所示程序在运行后成功将传入的图片数据绘制出来如下图所示说明该接口测试成功也证明了该方法是可行的。 4.2 接口二测试 在以下文件中分别添加以下代码 mat_conv.h #include opencv2/opencv.hpp extern C __declspec(dllexport) void __stdcall mat_conv2(cv::Mat **returnValue);mat_conv.cpp #include mat_conv.hvoid mat_conv2(cv::Mat** returnValue) {// 创建一个空白图像cv::Mat image cv::Mat::zeros(400, 400, CV_8UC3);// 矩形的左上角和右下角坐标cv::Point2f rect_start(50, 50);cv::Point2f rect_end(350, 350);// 矩形颜色 (B, G, R)cv::Scalar color(255, 0, 0); // 红色// 矩形线条粗细int thickness 2;// 绘制矩形cv::rectangle(image, rect_start, rect_end, color, thickness);*returnValue new cv::Mat(image); }Program.cs using OpenCvSharp; using OpenCvSharp.Internal; using System.Runtime.InteropServices; namespace opencv_csharp {internal class Program{static void Main(string[] args){Console.WriteLine(Hello, World!);IntPtr ptr2 IntPtr.Zero;Methord.mat_conv2(out ptr2);Mat mat2 new Mat(ptr2);Cv2.ImShow(image2, mat2);Cv2.WaitKey(0);}}class Methord {private const string dll_path C:\\Users\\lenovo\\Desktop\\test_opencv\\x64\\Release\\opencv_cpp.dll;[DllImport(dll_path, CharSet CharSet.Unicode, CallingConvention CallingConvention.Cdecl)]public static extern void mat_conv2(out IntPtr returnValue);} }其中mat_conv.h、mat_conv.cpp为C项目文件Program.cs文件为C#项目文件。 在C项目文件中mat_conv2(cv::Mat** returnValue)主要是创建一个画布并绘制一个矩形然后将创建好的图片数据以指针的方式传递到C#中。 在C#项目中使用[DllImport]属性将动态链接库中的mat_conv2读取出来传出数据此处使用的是双重指针因此使用out IntPtr进行接收。在获取到该方法后我们调用new Mat(IntPtr ptr)构造方法初始化为新的Mat数据。。 如下图所示程序在运行后成功将传出的图片数据绘制出来如下图所示说明该接口测试成功也证明了该方法是可行的。 4.3 接口三测试 在以下文件中分别添加以下代码 mat_conv.h #include opencv2/opencv.hpp extern C __declspec(dllexport) void __stdcall mat_conv3(cv::Mat * mat, cv::Mat **returnValue);mat_conv.cpp #include mat_conv.hvoid mat_conv3(cv::Mat * mat, cv::Mat **returnValue) {cv::Mat m;cv::cvtColor(*mat, m, cv::COLOR_BGR2GRAY);*returnValue new cv::Mat(m); }Program.cs using OpenCvSharp; using OpenCvSharp.Internal; using System.Runtime.InteropServices; namespace opencv_csharp {internal class Program{static void Main(string[] args){Console.WriteLine(Hello, World!);string image_path image.jpg;Mat mat3 Cv2.ImRead(image_path);IntPtr ptr3 IntPtr.Zero;Methord.mat_conv3(mat1.CvPtr, out ptr3);Mat mat3 new Mat(ptr3);Cv2.ImShow(image1, mat3);Cv2.WaitKey(0);}}class Methord {private const string dll_path C:\\Users\\lenovo\\Desktop\\test_opencv\\x64\\Release\\opencv_cpp.dll;[DllImport(dll_path, CharSet CharSet.Unicode, CallingConvention CallingConvention.Cdecl)]public static extern void mat_conv3(IntPtr mat, out IntPtr return_value);} }其中mat_conv.h、mat_conv.cpp为C项目文件Program.cs文件为C#项目文件。 在C项目文件中 mat_conv2(cv::Mat * mat, cv::Mat **returnValue)方法主要是接受传入的Mat指针并将传入的图片数据转为灰度图同时将转换好的图片数据以指针的方式传出到C#中。 在C#项目中使用[DllImport]属性将动态链接库中的mat_conv3读取出来其中传入数据为指针数据所以直接使用IntPtr即可而对于传出数据此处使用的是双重指针因此使用out IntPtr进行接收。在获取到该方法后我们调用new Mat(IntPtr ptr)构造方法初始化为新的Mat数据。 如下图所示程序在运行后成功将传入的图片数据进行灰度转换并将转换后的图片数据成功传递出来说明该接口测试成功也证明了该方法是可行的。同时我们测试了该过程所需时间仅使用了3.69毫秒。 4.4 接口四测试 在以下文件中分别添加以下代码 mat_conv.h #include opencv2/opencv.hpp extern C __declspec(dllexport) void __stdcall mat_conv4(cv::Mat * mat);mat_conv.cpp #include mat_conv.hvoid mat_conv4(cv::Mat* mat) {// 矩形的左上角和右下角坐标cv::Point2f rect_start(50, 50);cv::Point2f rect_end(350, 350);// 矩形颜色 (B, G, R)cv::Scalar color(255, 0, 0); // 红色// 矩形线条粗细int thickness 2;// 绘制矩形cv::rectangle(*mat, rect_start, rect_end, color, thickness); }Program.cs using OpenCvSharp; using OpenCvSharp.Internal; using System.Runtime.InteropServices; namespace opencv_csharp {internal class Program{static void Main(string[] args){Console.WriteLine(Hello, World!);string image_path image.jpg;Mat mat4 Cv2.ImRead(image_path);Methord.mat_conv4(mat1.CvPtr);Cv2.ImShow(image2, mat4);Cv2.WaitKey(0);}}class Methord {private const string dll_path C:\\Users\\lenovo\\Desktop\\test_opencv\\x64\\Release\\opencv_cpp.dll;[DllImport(dll_path, CharSet CharSet.Unicode, CallingConvention CallingConvention.Cdecl)]public static extern void mat_conv4(IntPtr mat);} }其中mat_conv.h、mat_conv.cpp为C项目文件Program.cs文件为C#项目文件。 在C项目文件中 mat_conv4(IntPtr mat)方法主要是接受传入的Mat指针并在传入的图片数据中绘制一个矩形因为该操作是在原始数据上进行的操作没有产生新的图像数据所以不需要传出。 在C#项目中使用[DllImport]属性将动态链接库中的mat_conv4读取出来其中传入数据为指针数据所以直接使用IntPtr即可。然后该方法运行完后我们直接查看该图像数据信息查看是否已经被修改。 如下图所示程序在运行后结果如下图所示说明该接口测试成功也证明了该方法是可行的。 5. 总结 在项目中我们结合OpenCvSharp源码使用OpenCvSharp数据指针实现了在C#与C之间传递图像数据。与传统的数据传递方式相比该方式通过传递指针通过指针的方式实现对同一块图像数据进行操作避免了图像数据的来回转换极大的节省了程序运行时间以及内存消耗。 最后如果各位开发者在使用中有任何问题欢迎大家与我联系。
http://www.zqtcl.cn/news/605729/

相关文章:

  • 中国室内设计联盟网官网网站专题页优化
  • 设计模板图热狗网站关键词优化
  • 无锡网站开发公司重庆网站有哪些
  • 做网站找什么公司工作网站开发思维导图内容
  • 有人知道做网站吗?wordpress多站点cdn
  • 网站风格特点大型外包公司有哪些
  • 如何网站seo用asp做网站有哪控件
  • 网站建设需要哪些成本wordpress商城建站教程
  • 做网络的网站很重要吗网站认证费用
  • flash网站项目背景网页截图快捷键可拉动
  • 郑州企业建设网站北京企业网站模板建站开发
  • 宣传旅游网站建设的观点是什么公众号怎么推广和引流
  • 企业网站制作多少钱山西网络营销方案
  • 焦作住房和城乡建设局网站旅行网站模板
  • 男做基视频网站国家重点高新技术企业名单
  • 公司官方网站开发网站建设电子商务
  • seo网站优化系统搜索引擎优化排名案例
  • 郑州网站建设工作室网站建设全流程 知乎
  • 如何利用源码做网站外贸网站制作推广
  • 国内做网站哪家公司好免费查找资料的网站
  • 自己做的网站百度搜不到搭建网站seo
  • 奇墙网站建设高端网站建设公司联系电话
  • 宁波那家公司做网站好中企动力科技股份有限公司招聘
  • 水果网站推广网站首页静态好还是动态好
  • iis网站属性小程序源码无需服务器
  • 景区网站建设材料代运营有哪些套路坑
  • 六安电商网站建设哪家好有关做美食的网站
  • 卸载wordpress插件网店seo关键词
  • 金山网站制作赤城seo网站优化排名
  • 提供坪山网站建设深圳商城网站哪家做的好