C#传hobject图片给C++主要是将hobject的数据指针传入,C++再使用opencv读取指针生成图片,本文分别介绍RGB3通道图和单通道图片。
RGB图片传入方法1:
C++部分程序
extern "C" __declspec(dllexport) void GetImageFromCSharp(uchar* dataR, uchar* dataG, uchar* dataB, int width, int height)
{
//使用3通道图片指针分别生成图片,再进行融合
cv::Mat img;
std::vector<cv::Mat> vecImg(3);
vecImg[0] = cv::Mat(height, width, CV_8UC1, dataB);
vecImg[1] = cv::Mat(height, width, CV_8UC1, dataG);
vecImg[2] = cv::Mat(height, width, CV_8UC1, dataR);
cv::merge(vecImg, img);
//显示
cv::namedWindow("image", 0);
cv::imshow("image", img);
cv::waitKey(0);
}
C#程序需要使用C++导出的DLL,然后使用函数将指针传入。
//使用C++函数
[DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
extern static public void GetHobjectFromCSharp(IntPtr dataR, IntPtr dataG, IntPtr dataB, int width, int height);
//=======================获取图片3通道的指针==================================
//读取图片并获取宽高
HOperatorSet.ReadImage(out HObject ho_img, "E:\\OnnxTransEngine\\bus.jpg");
HOperatorSet.GetImageSize(ho_img, out HTuple ht_width, out HTuple ht_height);
//传入图片信息
HOperatorSet.GetImagePointer3(ho_img, out HTuple PointerR, out HTuple PointerG, out HTuple PointerB, out HTuple type, out HTuple width, out HTuple height);
GetHobjectFromCSharp(PointerR, PointerG, PointerB, width, height);
RGB图片传入方法2:
C++部分程序
extern "C" __declspec(dllexport) void GetHobjectFromCSharp(uchar* data, int width, int height)
{
//读取指针数据直接生成图片
cv::Mat img = cv::Mat(height, width, CV_8UC3, data);
//显示
cv::namedWindow("image", 0);
cv::imshow("image", img);
cv::waitKey(0);
}
C#程序需要使用C++导出的DLL,然后使用函数将指针传入。
//使用C++程序
[DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
extern static public void GetHobjectFromCSharp(IntPtr data, int width, int height);
//=============================将3通道指针合为1个==========================
//读取图片并获取宽高
HOperatorSet.ReadImage(out HObject ho_img, "E:\\OnnxTransEngine\\bus.jpg");
HOperatorSet.GetImageSize(ho_img, out HTuple ht_width, out HTuple ht_height);
//创建交错格式图像
HOperatorSet.InterleaveChannels(ho_img, out HObject interleaved, "rgb", "match", 255);
//获取交错格式图像指针
HOperatorSet.GetImagePointer1(interleaved, out HTuple hv_Pointer, out HTuple type, out HTuple width, out HTuple height);
//传入图片信息
GetHobjectFromCSharp(hv_Pointer, ht_width, ht_height);
单通道图片传入:
C++部分程序
extern "C" __declspec(dllexport) void GetHobjectFromCSharp(uchar* data, int width, int height)
{
//读取指针数据直接生成图片
cv::Mat img = cv::Mat(height, width, CV_8UC1, data);
//显示
cv::namedWindow("image", 0);
cv::imshow("image", img);
cv::waitKey(0);
}
C#程序需要使用C++导出的DLL,然后使用函数将指针传入。
//使用C++程序
[DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
extern static public void GetHobjectFromCSharp(IntPtr data, int width, int height);
//=============================单通道==========================
//读取图片并获取宽高
HOperatorSet.ReadImage(out HObject ho_img, "E:\\OnnxTransEngine\\bus.jpg");
HOperatorSet.Rgb1ToGray(ho_img, out HObject ho_grayImage);
HOperatorSet.GetImageSize(ho_grayImage, out HTuple ht_width, out HTuple ht_height);
//获取图像指针
HOperatorSet.GetImagePointer1(ho_grayImage, out HTuple hv_Pointer, out HTuple type, out HTuple width, out HTuple height);
//传入图片信息
GetHobjectFromCSharp(hv_Pointer, ht_width, ht_height);
针对RGB的两种传输方法来比较,方法2速度会更快一些。