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

【09】大恒相机SDK C#开发 ——库函数 IntPtr ConvertToRGB24详细解释 及 示例

文章目录

  • 1 ConvertToRGB24 功能及参数解释
  • 2 使用案例

1 ConvertToRGB24 功能及参数解释

IntPtr ConvertToRGB24(GX_VALID_BIT_LIST emValidBits, GX_BAYER_CONVERT_TYPE_LIST emConvertType, [MarshalAs(UnmanagedType.U1)] bool bFlip);

功能: 将从大恒相机获取的原始图像数据转换为RGB24格式的图像数据。

参数的详细解释:

  • emValidBits:这个参数是一个枚举类型,用于指定原始数据中哪些位是有效的。在图像传感器中,每个像素通常用一个或多个位来表示亮度值。这个参数可以帮助指定应该使用哪些位来生成RGB图像。例如,如果相机采用的是8位深度的传感器,那么可能有效位为GX_BIT_0_7,表示使用0到7位的数据。如果是10位深度的传感器,可能有效位为GX_BIT_0_9,表示使用0到9位的数据。

  • emConvertType:这个参数是另一个枚举类型,用于指定转换的类型。大恒相机库可能提供了不同的转换算法,以满足不同应用场景的需求。可能的选项包括GX_RAW2RGB_NEIGHBOUR(使用邻近插值算法进行转换)、GX_RAW2RGB_ADAPTIVE(自适应插值算法)等。你可以根据实际需要选择适合的转换类型。

  • bFlip:这是一个布尔值参数,用于指定是否需要翻转图像。在某些情况下,相机获取的原始图像可能需要在垂直方向上翻转才能正确显示。如果设置为true,则表示需要进行垂直翻转;如果设置为false,则表示不进行翻转。

这个方法返回一个 IntPtr 类型的指针,指向转换后的RGB24格式的图像数据。在使用这个指针时,需要谨慎确保内存的正确释放,以避免内存泄漏或其他问题。通常,你可以将这个指针传递给其他处理图像数据的函数,或者将其转换为 Bitmap 等图像格式进行显示和处理。

GX_VALID_BIT_LIST参数可选项

public enum GX_VALID_BIT_LIST
{GX_BIT_4_11 = 4,GX_BIT_3_10 = 3,GX_BIT_2_9 = 2,GX_BIT_1_8 = 1,GX_BIT_0_7 = 0
}

在这里插入图片描述
GX_BAYER_CONVERT_TYPE_LIST参数可选项

public enum GX_BAYER_CONVERT_TYPE_LIST
{GX_RAW2RGB_NEIGHBOUR3 = 2,GX_RAW2RGB_ADAPTIVE = 1,GX_RAW2RGB_NEIGHBOUR = 0
}

在这里插入图片描述

2 使用案例

该案例将中

  • objIFrameData 图像数据 通过 m_objGxBitmap1.Show(objIFrameData);显示相机原画面

  • 通过ConvertToRGB24函数将相机获取到的原图像数据objIFrameData 换换为RGB24格式的图像数据,
    该方法返回一个 IntPtr 类型的指针pBuffer1指向转换后的RGB24格式的图像数据。然后可以将这个指针传递给其他处理图像数据的函数(比如传给C++接口函数,将其转换为Mat 图像进行opencv处理),或者将其转换为 Bitmap 等图像格式进行显示和处理。

 private void __OnFrameCallbackFun_1(object objUserParam, IFrameData objIFrameData){try{if (null != objIFrameData){lock (this){if (isShowSrcImg) //是否显示原画面{//************************************************************//显示相机获取的原图//************************************************************ m_objGxBitmap1.Show(objIFrameData);}//else if (camImg_isProcess[0])//Buffer要一直获取,等到要处理时在获取来及不,buffer报错{//************************************************************//图像处理显示 等功能做准备//*************************************************************//获取图像宽高SrcImgHeight = (int)objIFrameData.GetHeight();SrcImgWidth = (int)objIFrameData.GetWidth();//图像缓存传给C++处理if (colorFlag)//彩色//判断是黑板还是彩色相机{//获取图像buffer pBuffer1 = objIFrameData.ConvertToRGB24(GX_VALID_BIT_LIST.GX_BIT_0_7, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false);}else//黑白{pBuffer1 = objIFrameData.GetBuffer();}}m_objCFps1.IncreaseFrameNum();////刷新界面//m_objGxBitmap1 = new GxBitmap(m_listCCamerInfo[m_nOperateID].m_objIGXDevice, ImageShow1);}}}catch (Exception ex){MessageBox.Show("回调函数1" + ex.Message);}}

值得注意的是,

  • 相机获得的原图像数据 显示相机原画面Show(objIFrameData)是需要垂直翻转,即图像上下颠倒,至于为什么这样,可能是大恒相机获取的图像数据在内存中存储方式有关。

  • 而我们转换为ConvertToRGB24格式进行其他处理,是不需要垂直翻转的。如,获取pBuffer传给C++接口函数,获取pBuffer然后进行ROI截图,用pictureBox显示等都不需要垂直翻转。

  • (那就奇了,显示相机原画面Show(objIFrameData)是需要垂直翻转,objIFrameData进行ROI截图显示不需要翻转;这不都是在C#中 pictureBox中显示吗?为啥

显示相机原画面Show()函数中 ConvertToRGB24函数,最后一个参数 bFlip = true;

IntPtr pBufferColor = objIBaseData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, true);

而我 传给C++接口函数 、ROI截图用pictureBox显示中 ConvertToRGB24函数,最后一个参数 bFlip = false;(我刚开始也跟着 true,结果截取的ROI位置不对,画面也上下颠倒)

 pBuffer1 = objIFrameData.ConvertToRGB24(GX_VALID_BIT_LIST.GX_BIT_0_7, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false);

下面是 显示相机原画面Show()函数,他最终也是通过 pictureBox显示的;

 /// <summary>/// 用于显示图像/// </summary>/// <param name="objIBaseData">图像数据对象</param>public void Show(IBaseData objIBaseData){GX_VALID_BIT_LIST emValidBits = GX_VALID_BIT_LIST.GX_BIT_0_7;//检查图像是否改变并更新Buffer__UpdateBufferSize(objIBaseData);if (null != objIBaseData){emValidBits = __GetBestValudBit(objIBaseData.GetPixelFormat());if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS == objIBaseData.GetStatus()){if (m_bIsColor){IntPtr pBufferColor = objIBaseData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, true);Marshal.Copy(pBufferColor, m_byColorBuffer, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeigh);__ShowImage(m_byColorBuffer);}else{IntPtr pBufferMono = IntPtr.Zero;if (__IsPixelFormat8(objIBaseData.GetPixelFormat())){pBufferMono = objIBaseData.GetBuffer();}else{pBufferMono = objIBaseData.ConvertToRaw8(emValidBits);}byte[] byMonoBufferTmp = new byte[__GetStride(m_nWidth, m_bIsColor) * m_nHeigh];Marshal.Copy(pBufferMono, byMonoBufferTmp, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeigh);// 黑白相机需要翻转数据后显示for (int i = 0; i < m_nHeigh; i++){Buffer.BlockCopy(byMonoBufferTmp, (m_nHeigh - i - 1) * m_nWidth, m_byMonoBuffer, i * m_nWidth, m_nWidth);}__ShowImage(m_byMonoBuffer);}}}}/// <summary>
/// 显示图像处理
/// </summary>
/// <param name="byBuffer">图像数据buffer</param>
private void __ShowImage(byte[] byBuffer)
{if (null != m_pic_ShowImage)//m_pic_ShowImage是pictureBox控件{CWin32Bitmaps.SetStretchBltMode(m_pHDC, COLORONCOLOR);CWin32Bitmaps.StretchDIBits(m_pHDC,0,0,m_pic_ShowImage.Width,m_pic_ShowImage.Height,0,0,m_nWidth,m_nHeigh,byBuffer,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);            }
}
http://www.dtcms.com/a/307385.html

相关文章:

  • 【Linux系统】库的制作与原理
  • 007TG洞察:波场TRON上市观察,Web3流量工具的技术解析与应用
  • 【Linux系列】SSD 与 HDD
  • 学习日志23 python
  • 深度理解 linux 系统内存分配
  • 用 AI 解析采购订单,从上传到自动生成 Draft 订单全流程实战
  • 多种录音笔录音芯片方案推荐
  • 《Java 程序设计》第 17 章 - 并发编程基础
  • MBR与GPT分区表深度解析:硬盘分区该怎么选?
  • CPP学习之继承
  • 《Java 程序设计》第 18 章 - Java 网络编程
  • 常见的中间件漏洞
  • AI IDE+AI 辅助编程-生成的大纲-一般般
  • 设计模式:责任链模式 Chain of Responsibility
  • 排序的演进:从机械齿轮到领域专用芯片加速器的全面综述
  • Centos 7部署.NET 8网站项目
  • 如何在 macOS 上使用 dnsmasq 搭建本地 DNS 缓存/转发
  • 微服务 02
  • 05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
  • 深度解析:从零构建跨平台对象树管理系统(YongYong框架——QT对象树机制的现代化替代方案)
  • iOS15及以后国际化如何设置.xcstrings文件默认语言
  • Redis 存在哪些问题
  • [论文阅读] 人工智能 + 软件工程 | KnowledgeMind:基于MCTS的微服务故障定位新方案——告别LLM幻觉,提升根因分析准确率
  • PPT自动化 python-pptx - 8: 文本(text)
  • Cesium 快速入门(八)Primitive(图元)系统深度解析
  • Web开发-PHP应用Cookie脆弱Session固定Token唯一身份验证数据库通讯
  • uniapp 3d模型预览组件 用于3d模型预览 工业配件展示 组件地址
  • 智慧园区系统:未来办公生活的新蓝图
  • 抓大鹅小游戏微信抖音流量主小程序开源
  • ros2--参数指令--rqt