Halcon学习之图像采集
1.读取文件夹中的图片
1.1打开Halcon12开发环境
1.2打开“助手”中的“Image Acquistion”
1.3选择“图像文件”选项——“选择路径”——选择存放图片的文件夹
1.4选择“代码生成”选项——点击“插入代码”按钮
1.5 在代码区就是采集代码,可以添加stop()方法后不断点击运行按钮运行代码查看逐一读取图片的效果
2.读取摄像头实时采集
2.1连接Halcon支持的摄像头(无需安装摄像头驱动),这里我用的是大恒的一款摄像头
2.2选择“Image Acquistion”中的“图像获取接口”选项——点击“自动检测接口”按钮
2.2选择“连接”选项卡——点击下方“连接”按钮——点击“实时”按钮摄像头开始采集图像
注:由于我没有连接镜头所以采集到的图像只有灰色的
2.3选择“参数”选项卡——调节对应的摄像头参数——选择“代码生成”选项卡——点击“插入代码”按钮则会导出我们需要的Halcon代码
3.Halcon导出到C#进行图像采集
3.1图像采集的一般方法
使用Halcon导出代码结合C#中Application.Idle事件进行循环采集显示。
使用Halcon导出代码结合C#中的线程进行循环采集显示。
当所选用的摄像头不支持Halcon时,一般选择修改厂商提供的SDK进行采集显示。
3.2这里我介绍第二种方法,因为现代处理器的核在不断增加,采用多线程异步编程才能发挥多核处理的性能提高软件系统的数据处理和吞吐能力
3.2.1首先要解决以下几个问题:
如果希望使用.net的原生控件Picturebox则需要对Halcon导出的C#代码进行修改。
Halcon导出代码采集的图像格式和.net的Image是不兼容的,需要进行转换。
需要将导出代码中的“初始化摄像头”、“启动摄像头”、“关闭摄像头”、“设置摄像头参数”这几块内容进行封装符合面向对象的编程需要。
注:不使用Halcon提供的.net控件的坏处是增加了图像格式转换的开销如果图像像素特别高,系统显示帧率有要求,就需要更高配置的电脑
3.2.2关于实际的代码部分废话不多说直接给Demo
注:根目录下需要放入halcondotnet.dll和halcon.dl,并在开发环境中引用halcondotnet.dll
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using HalconDotNet;

/// <summary>
/// 摄像头类
/// </summary>
public class ImageGraber
{
    [DllImport("Kernel32.dll")]
    internal static extern void CopyMemory(int dest, int source, int size);

private HObject ho_Image = null;            //Halcon中采集的图像对象
    private HTuple hv_AcqHandle = null;         //Halcon中摄像头操作句柄
    private PictureBox picCamera = null;        //采集图像显示区
    private Thread imageGrabeThread = null;     //图像采集异步线程

/// <summary>
    /// 摄像头初始化成功标志
    /// </summary>
    public bool IsInitSuccess { get; set; }

/// <summary>
    /// 摄像头处于采集中标志
    /// </summary>
    public bool IsStart { get; set; }

/// <summary>
    /// 摄像头增益参数
    /// </summary>
    private int gain;
    public int Gain 
    {
        get
        {
            return gain;
        }

set
        {
            try
            {
                HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "gain", value);
                gain = value;
            }
            catch (Exception) {  }
        }
    }

/// <summary>
    /// 摄像头快门参数
    /// </summary>
    private int shutter;
    public int Shutter
    {
        get
        {
            return shutter;
        }

set
        {
            try
            {
                HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "shutter", value);
                shutter = value;
            }
            catch (Exception) { }
        }
    }

//其他摄像头参数如法炮制...

/// <summary>
    /// 构造函数
    /// </summary>
    public ImageGraber(PictureBox picCamera)
    {
        try
        {
            this.picCamera = picCamera;
            IsInitSuccess = false;
            IsStart = false;
            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.OpenFramegrabber("DahengCAM", 1, 1, 0, 0, 0, 0, "interlaced", 8,
                                          "gray", -1, "false", "HV-xx51", "1", 1, -1, out hv_AcqHandle);
            HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
            IsInitSuccess = true;
        }
        catch (Exception) { IsInitSuccess = false; }
    }

/// <summary>
    /// 采集一帧图像
    /// </summary>
    /// <returns></returns>
    public Bitmap GrabSingleFrame()
    {
        try
        {
            Bitmap GrabBitmap = null;
            ho_Image.Dispose();
            HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
            ConvertHalconGrayByteImageToBitmap(ho_Image, out GrabBitmap);
            return GrabBitmap;
        }
        catch (Exception) { return null; }
    }

/// <summary>
    /// 关闭摄像头
    /// </summary>
    /// <returns></returns>
    public bool CloseCamera()
    {
        try
        {
            HOperatorSet.CloseFramegrabber(hv_AcqHandle);
            ho_Image.Dispose();
            return true;
        }
        catch (Exception) { return false; }
    }

/// <summary>
    /// 图像采集线程函数
    /// </summary>
    private void ImageGrabThread()
    {
        while (true)
        {
            this.picCamera.Image = GrabSingleFrame();
        }
    }

/// <summary>
    /// 开始采集
    /// </summary>
    public void Start()
    {
        if (!IsStart && imageGrabeThread == null)
        {
            imageGrabeThread = new Thread(new ThreadStart(ImageGrabThread));
            imageGrabeThread.Start();
            IsStart = true;
        }
    }

/// <summary>
    /// 停止采集
    /// </summary>
    public void Stop()
    {
        if (IsStart && imageGrabeThread != null)
        {
            imageGrabeThread.Abort();
            imageGrabeThread = null;
            IsStart = false;
        }
    }

/// <summary>
    /// 将Halcon中8位灰度图转换为Bitmap图像
    /// </summary>
    /// <param name="image">Halcon中8位灰度图</param>
    /// <param name="res">.net中Bitmap图像</param>
    private void ConvertHalconGrayByteImageToBitmap(HObject image, out Bitmap res)
    {
        HTuple hpoint, type, width, height;

const int Alpha = 255;
        int[] ptr = new int[2];
        HOperatorSet.GetImagePointer1(image, out hpoint, out type, out width, out height);

res = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
        ColorPalette pal = res.Palette;
        for (int i = 0; i <= 255; i++)
        {
            pal.Entries[i] = Color.FromArgb(Alpha, i, i, i);
        }
        res.Palette = pal;
        Rectangle rect = new Rectangle(0, 0, width, height);
        BitmapData bitmapData = res.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
        int PixelSize = Bitmap.GetPixelFormatSize(bitmapData.PixelFormat) / 8;
        ptr[0] = bitmapData.Scan0.ToInt32();
        ptr[1] = hpoint.I;
        if (width % 4 == 0)
            CopyMemory(ptr[0], ptr[1], width * height * PixelSize);
        else
        {
            for (int i = 0; i < height - 1; i++)
            {
                ptr[1] += width;
                CopyMemory(ptr[0], ptr[1], width * PixelSize);
                ptr[0] += bitmapData.Stride;
            }
        }
        res.UnlockBits(bitmapData);
    }

/// <summary>
    /// 将Halcon中RGB图像转换为Bitmap图像
    /// </summary>
    /// <param name="image">Halcon中RGB图像</param>
    /// <param name="res">.net中Bitmap图像</param>
    private void GenertateRGBBitmap(HObject image, out Bitmap res)
    {
        HTuple hred, hgreen, hblue, type, width, height;
        HOperatorSet.GetImagePointer3(image, out hred, out hgreen, out hblue, out type, out width, out height);
        res = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        Rectangle rect = new Rectangle(0, 0, width, height);
        BitmapData bitmapData = res.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
        unsafe
        {
            byte* bptr = (byte*)bitmapData.Scan0;
            byte* r = ((byte*)hred.I);
            byte* g = ((byte*)hgreen.I);
            byte* b = ((byte*)hblue.I);
            for (int i = 0; i < width * height; i++)
            {
                bptr[i * 4] = (b)[i];
                bptr[i * 4 + 1] = (g)[i];
                bptr[i * 4 + 2] = (r)[i];
                bptr[i * 4 + 3] = 255;
            }
        }

res.UnlockBits(bitmapData);
    }

}

Halcon学习之图像采集相关推荐

  1. HALCON学习之旅(六)

    HALCON学习之旅(六) 文章目录 HALCON学习之旅(六) 1.Halcon代码如何导出高级编程语言代码 + 配置Halcon/C++编程环境 2.Halcon连续采集相机图像 3.Halcon ...

  2. 转:跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开H ...

  3. halcon例程讲解_跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...

  4. 机器视觉-halcon学习笔记1

    德国的软件,傻瓜式安装,每月更新的licence:开发环境就配置好了. ps:软件可以直接在 halcon学习网上下载,18的版本就行. 这玩意有自带的脚本语言在halcon的开发环境IDE下写,写好 ...

  5. 随笔分类 - HALCON学习例程中文详解

    from: https://www.cnblogs.com/chita/category/563492.html 随笔分类 - HALCON学习例程中文详解 HALCON学习例程中文详解 跟我学机器视 ...

  6. Halcon学习笔记(三)---数据类型

    Halcon学习笔记(三)---数据类型 halcon只能在单独行进行注释,不能在语句后面进行注释. 1.tuple(元组,重数) 赋值符号":=" tuple算子: (1)变量定 ...

  7. Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)

    Halcon学习笔记:select_points_object_model_3d 3D对象模型阀值分割 This example program shows how to use the operat ...

  8. Halcon学习笔记:xyz_attrib_to_object_model_3d示例

    Halcon学习笔记:xyz_attrib_to_object_model_3d--从X.Y和Z图像中创建3D对象模型同时附加属性 xyz_attrib_to_object_model_3d.hdev ...

  9. Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例

    Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例 一.基本概念 基本流程为: 获取图像 对图像进行灰度值标定 (针对相机获取的图像灰度和输入能量之间的非线性关系, ...

最新文章

  1. Ubuntu 12.04安装Sun JDK 6
  2. select case语句举例_图解Go select语句原理
  3. 百度Apollo首次披露纯视觉L4无人车方案:10摄像头,对标Mobileye
  4. Tungsten Fabric SDN — Orchestrator 集成部署模式 — with Kubernetes
  5. animateWithDuration
  6. 使用Nexus搭建私有Nuget仓库
  7. 区块链应用开发人员_每个区块链开发人员都应该了解这些Web3和Metamask用例
  8. Mybatis高级应用 延迟加载
  9. 精诚合作 共创未来——阿里云数据智能合作策略介绍
  10. #16192董哥授课的CCNP交换部分总结(三)
  11. php输入指定文字转换成图片的简单例子
  12. Win7/10亲测可用:湘源控规6+CAD200832+64
  13. PWM是如何调节直流电机转速的?电机正反转的原理又是怎样的?
  14. Springboot使用@Scheduled多节点启动时调度重复执行
  15. IPFS李鑫:fil币2021年价格预测
  16. 趣图:道高一尺,魔高一丈
  17. JAVA#内部类'学习札记
  18. 刺激战场国际服服务器如何修改,刺激战场国际服如何更改自己的苹果id地区-无需购买海外id...
  19. 你应该了解真相_世界首次了解核风险的真相
  20. 利用饮食精准干预肠道微生物群

热门文章

  1. C语言——利用递归函数完成斐波拉契前n项的计算
  2. XSS测试平台搭建(超详细)
  3. 计算多项式的值——基于C语言程序
  4. 主成分分析法概述、案例实例分析
  5. Gibbs抽样方法详解
  6. Doris FE启动流程源码详细解析
  7. HQL和SQL的区别
  8. 计算机视觉中transformer的理解
  9. 嵌入式文件系统基础知识
  10. 油气计量比较好的软件_您准备好使用计量互联网了吗?