Halcon学习之图像采集
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学习之图像采集相关推荐
- HALCON学习之旅(六)
HALCON学习之旅(六) 文章目录 HALCON学习之旅(六) 1.Halcon代码如何导出高级编程语言代码 + 配置Halcon/C++编程环境 2.Halcon连续采集相机图像 3.Halcon ...
- 转:跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码
跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开H ...
- halcon例程讲解_跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量
跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...
- 机器视觉-halcon学习笔记1
德国的软件,傻瓜式安装,每月更新的licence:开发环境就配置好了. ps:软件可以直接在 halcon学习网上下载,18的版本就行. 这玩意有自带的脚本语言在halcon的开发环境IDE下写,写好 ...
- 随笔分类 - HALCON学习例程中文详解
from: https://www.cnblogs.com/chita/category/563492.html 随笔分类 - HALCON学习例程中文详解 HALCON学习例程中文详解 跟我学机器视 ...
- Halcon学习笔记(三)---数据类型
Halcon学习笔记(三)---数据类型 halcon只能在单独行进行注释,不能在语句后面进行注释. 1.tuple(元组,重数) 赋值符号":=" tuple算子: (1)变量定 ...
- Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)
Halcon学习笔记:select_points_object_model_3d 3D对象模型阀值分割 This example program shows how to use the operat ...
- 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 ...
- Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例
Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例 一.基本概念 基本流程为: 获取图像 对图像进行灰度值标定 (针对相机获取的图像灰度和输入能量之间的非线性关系, ...
最新文章
- Ubuntu 12.04安装Sun JDK 6
- select case语句举例_图解Go select语句原理
- 百度Apollo首次披露纯视觉L4无人车方案:10摄像头,对标Mobileye
- Tungsten Fabric SDN — Orchestrator 集成部署模式 — with Kubernetes
- animateWithDuration
- 使用Nexus搭建私有Nuget仓库
- 区块链应用开发人员_每个区块链开发人员都应该了解这些Web3和Metamask用例
- Mybatis高级应用 延迟加载
- 精诚合作 共创未来——阿里云数据智能合作策略介绍
- #16192董哥授课的CCNP交换部分总结(三)
- php输入指定文字转换成图片的简单例子
- Win7/10亲测可用:湘源控规6+CAD200832+64
- PWM是如何调节直流电机转速的?电机正反转的原理又是怎样的?
- Springboot使用@Scheduled多节点启动时调度重复执行
- IPFS李鑫:fil币2021年价格预测
- 趣图:道高一尺,魔高一丈
- JAVA#内部类'学习札记
- 刺激战场国际服服务器如何修改,刺激战场国际服如何更改自己的苹果id地区-无需购买海外id...
- 你应该了解真相_世界首次了解核风险的真相
- 利用饮食精准干预肠道微生物群