在C#中使用OpenCV的.net包装器EmguCV

Emgu.CV OpenCvSharp 两个库都是OpenCV的C#封装。这里不讨论优劣,两个都有相应的用途。

下载安装4.6.0.5131,执行文件exe

https://sourceforge.net/projects/emgucv/files/emgucv/4.6.0/

安装到一个目录下,这里安装到H:\Emgu\ 目录下。

使用示例说明:我们要在C# 里使用OpenCV的一个函数 CvtColor做颜色空间转换;用到了工业相机的原始数据输出,大多数工业相机的输出格式都是 Bayer格式,很多时候都需要转为RGB格式才可以使用,所以这里用OpenCV的CvtColor函数转换。

新建C# 工程项目

工程项目名称

添加库引用

运行64位的

程序完整源码

cs 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using MVSDK;//使用SDK接口
using CameraHandle = System.Int32;
using MvApi = MVSDK.MvApi;
using System.Runtime.InteropServices;

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;

namespace BasicEmguTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnGrab_Click(object sender, EventArgs e)
        {
            CameraSdkStatus status;
            CameraHandle m_hCamera = 0;
            tSdkCameraDevInfo[] tCameraDevInfoList;
            IntPtr ptr;
            IntPtr m_ImageBuffer;
            status = MvApi.CameraEnumerateDevice(out tCameraDevInfoList);
            if (status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
            {
                return;
            }
            if (tCameraDevInfoList == null)
            {
                return;
            }
            status = MvApi.CameraInit(ref tCameraDevInfoList[0], -1, -1, ref m_hCamera);
            if (status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
            {
                return;
            }
            tSdkCameraCapbility tCameraCapability;
            MvApi.CameraGetCapability(m_hCamera, out tCameraCapability);
            m_ImageBuffer = Marshal.AllocHGlobal(tCameraCapability.sResolutionRange.iWidthMax * tCameraCapability.sResolutionRange.iHeightMax * 4);
            MvApi.CameraPlay(m_hCamera);

            tSdkFrameHead FrameHead;
            IntPtr uRawBuffer;
            status = MvApi.CameraGetImageBuffer(m_hCamera, out FrameHead, out uRawBuffer, 20000);
            if (status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
            {
                return;
            }
            MvApi.CameraImageProcess(m_hCamera, uRawBuffer, m_ImageBuffer, ref FrameHead);
            
            MvApi.CameraSaveImage(m_hCamera, ".\\test.bmp", m_ImageBuffer, ref FrameHead, emSdkFileType.FILE_BMP, 100);

            //--------------------直接转换相机原始数据,假设输出是8位深度
            Mat matTmp0 = new Mat(FrameHead.iHeight, FrameHead.iWidth, DepthType.Cv8U, 1, uRawBuffer, FrameHead.iWidth * 1);
            Mat matRGB = new Mat();

            CvInvoke.CvtColor(matTmp0, matRGB, ColorConversion.BayerGb2Rgb);
            CvInvoke.NamedWindow("OpenCVRaw2RGB", WindowFlags.Normal);
            //CvInvoke.Imshow("OpenCVRaw2RGB", matRGB);
            //CvInvoke.WaitKey(5);
            CvInvoke.Imwrite(".\\testCV.bmp", matRGB);

            MvApi.CameraReleaseImageBuffer(m_hCamera, uRawBuffer);

            MvApi.CameraUnInit(m_hCamera);
            Marshal.FreeHGlobal(m_ImageBuffer);
        }
    }
}

最后采图转换成功的结果

(结束)

相关推荐
陈天伟教授1 分钟前
SolidWorks快速入门
人工智能·工业设计
IVVi0jToe3 分钟前
2026年是“多智能体元年”——从单Agent到Agent军团
人工智能
2zcode4 分钟前
基于MATLAB图像处理的苹果质量智能分级系统设计与实现
图像处理·人工智能·matlab
AI-好学者8 分钟前
MCP企业运用全面知识点-基础篇
服务器·开发语言·网络·人工智能·python·架构
csdn_aspnet11 分钟前
C# 截取或匹配字符串内包含指定字符的一些方法
c#·字符串·分割·string·匹配·截取
私人珍藏库16 分钟前
[Android] 多开空间-一机多账号+应用一键克隆双开
android·人工智能·智能手机·软件
Sam092716 分钟前
【AI 算法精讲 13】朴素贝叶斯:文本分类的基石
人工智能·python·算法·ai
SilentSamsara20 分钟前
模型可解释性业务化:SHAP/LIME 的业务汇报与合规审查
人工智能·算法·机器学习·自动化
STLearner22 分钟前
ICML 2026 | 时间序列(Time Series)论文总结【基础模型,生成,分类,异常检测,插补,表示学习和分析等】
论文阅读·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
qq_4087533922 分钟前
国内稳定调用 GPT/Claude 的落地实战:从配置到监控
人工智能·aigc·开发工具