Vm算子CMvdImage图片生成方法,即IntPtr转byte[]和byte[]
Vm算子CMvdImage图片生成方法,即IntPtr转byte[]和byte[]

用MVS   SDK采集的图片的数据格式是:

  IntPtr imageBuffer = IntPtr.Zero;
  int width, height, chanles;
  GetImage(out width, out height, out chanles, out imageBuffer);


如果我们在得到图片数据后,需要用到VM的算子开发。我们需要把图片生成为CMvdImage

我们需要:

CMvdImage InputImage = new CMvdImage();

MVD_IMAGE_DATA_INFO imageDataStruct = new MVD_IMAGE_DATA_INFO();

imageDataStruct.stDataChannel[0].nRowStep = Convert.ToUInt32(width);

imageDataStruct.stDataChannel[0].nLen = Convert.ToUInt32(width * height);

imageDataStruct.stDataChannel[0].nSize = Convert.ToUInt32(width * height);

 //IntPtr 转 byte[]   
int size = Convert.ToInt32(width * height);
byte[] managedArray = new byte[size];
Marshal.Copy(imageBuffer, managedArray, 0, size);
imageDataStruct.stDataChannel[0].arrDataBytes = managedArray;
InputImage.InitImage((uint)width, (uint)height, VisionDesigner.MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08, imageDataStruct);

InputImage.SaveImage("E:\\百度网盘下载\\3.bmp");   //保存图片测试

这就图像数据转换成功了。


延伸课题:-------------------如果我们得到byte[]数据,怎么转为IntPtr呢----------------------------

下面提供一种方法:

IntPtr  IntPtr_=ArrToPtr(managedArray);

具体方法为:

 IntPtr ArrToPtr(byte[] array)
{
return System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(array, 0);
}

然后可以进行测试转换是否成功:

HOperatorSet.GenImage1(out image, "byte", width, height, ArrToPtr(managedArray));
HOperatorSet.WriteImage(image, "jpg", 0, "E:\\百度网盘下载\\2.jpg");


查看本地图片效果:---->图片一样,说明转换成功。


所有的测试程序为:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using EventMgrLib;
using HikCam;
using TouchSocket.Core;
using UIImagePress;
using UpVisionService;
using VisionDesigner;

namespace UpVisionService
{
public partial class test : Form
{
/// <summary>
/// 相机SN-->1_1 1_2 1_3 1_4 2_1 2_2 2_3 2_4
/// </summary>
private List<Cam> camSnList = new List<Cam>()
{
new Cam() { Name = "相机1_1" },
};
private List<OneCam> cams = new List<OneCam>() { new OneCam() };


public test()
{
InitializeComponent();

camSnList[0].SN = "K73949038";

int i = 0;
foreach (var item in cams)
{
camSnList[i].Statue = item.Init(camSnList[i].SN);
i++;
}

}

private void btn_save_Click(object sender, EventArgs e)
{
CMvdImage InputImage = new CMvdImage();
Stopwatch sw = new Stopwatch();
sw.Restart();
HObject image = new HObject();
IntPtr imageBuffer = IntPtr.Zero;
int width, height, chanles;

if (cams[0].GetImage(out width, out height, out chanles, out imageBuffer))
{
HOperatorSet.GenImage1(out image, "byte", width, height, imageBuffer);
HOperatorSet.WriteImage(image, "jpg", 0, "E:\\百度网盘下载\\1.jpg");

MVD_IMAGE_DATA_INFO imageDataStruct = new MVD_IMAGE_DATA_INFO();
imageDataStruct.stDataChannel[0].nRowStep = Convert.ToUInt32(width);
imageDataStruct.stDataChannel[0].nLen = Convert.ToUInt32(width * height);
imageDataStruct.stDataChannel[0].nSize = Convert.ToUInt32(width * height);
//IntPtr 转 byte[]
int size = Convert.ToInt32(width * height);
byte[] managedArray = new byte[size];
Marshal.Copy(imageBuffer, managedArray, 0, size);
imageDataStruct.stDataChannel[0].arrDataBytes = managedArray;
InputImage.InitImage((uint)width, (uint)height, VisionDesigner.MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08, imageDataStruct);
InputImage.SaveImage("E:\\百度网盘下载\\3.bmp");

//另外备注一下 byte[] 转 IntPtr
HOperatorSet.GenImage1(out image, "byte", width, height, ArrToPtr(managedArray));
HOperatorSet.WriteImage(image, "jpg", 0, "E:\\百度网盘下载\\2.jpg");
Console.WriteLine($"获取图片用时:{sw.ElapsedMilliseconds}毫秒");
}
else
{
Console.WriteLine($"获取图片用时:{sw.ElapsedMilliseconds}毫秒");
}

}

IntPtr ArrToPtr(byte[] array)
{
return System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(array, 0);
}


private void test_FormClosing(object sender, FormClosingEventArgs e)
{
cams[0].CloseCam();
}
}


核心图片:



版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

VisionMaster在脚本更改存图路径

下一篇

Hacon的仿射变换以后矩形框的角度转为VM的的矩形框的角度表达

评论请先登录 登录
全部评论 0
Lv.0
2
关注
13
粉丝
7
创作
45
获赞
所属专题
  • VM4.2二次开发环境配置方法(入门必看)
  • Visionmaster4.2 + QT5.14.2 + VS2017二次开发保姆级避坑课程
  • 使用VisionMaster4.2SDK联合C#进行二次开发入门
  • VM二次开发视觉框架(C#)
  • 二次开发过程注意的点
  • 开发一个自己的VM模块(三)
  • 开发一个自己的VM模块(二)
  • 开发一个自己的VM模块系列一:模块详解
  • 【VM集成开源AI】深度学习算子模块封装
  • Vm算子CMvdImage图片生成方法,即IntPtr转byte[]和byte[]
  • Sauvola二值化处理在图像处理应用的优势介绍分析
  • “启智杯”设计大赛-一种模板匹配建模与识别控件
  • “启智杯”模板匹配控件的扇形掩膜实现方式交流
  • “启智杯”:IMvdImage类型转换为MFC的CBitmap类型
  • "启智杯":确定扇环外切矩形的方法
  • VM二次开发小技巧-增加十字辅助线
  • VM二次开发小技巧—快速匹配模板切换
相关阅读
  • 【3D系列】我们用2D相机实现3D无序抓取了
    2024-10-21 浏览 0
  • 【3D系列】我们用2D相机实现3D无序抓取了
    2024-10-21 浏览 0
  • 第三届“悉灵杯”基于MV-DT01SDU相机识别果蔬等数据集
    2024-10-14 浏览 0
  • 第三届“悉灵杯”基于MV-DT01SDU相机识别果蔬等数据集
    2024-10-14 浏览 0
  • [启智杯]赛事资料下载说明
    2024-10-29 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器