C#halcon图片(hobject)传C++opencv图片(mat)

        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速度会更快一些。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值