1.程序主体
2.演示效果
3.检测类
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 System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.IO;
using HalconDotNet;
namespace VeriCode_Demo
{
public partial class Form1 : Form
{
//---------------------------------------------------------------解码
[DllImport("VRdll.dll", EntryPoint = "vcRead", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern short vcRead(short xSize, short ySize, int pimg, StringBuilder msg, int IsContrastNormal, ref short vcCorners, short SampleWidth, short BitsPerCell, short Prefiltering);
[DllImport("VRdll.dll", EntryPoint = "GetDllVersion", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern short GetDllVersion(StringBuilder szbuf, int nBufSize);
[DllImport("VRdll.dll", EntryPoint = "GetSymbolCorners", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern void GetSymbolCorners(ref short szbuf);
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", CharSet = CharSet.Ansi)]
public extern static long CopyMemory(int dest, int source, int size);
int mwidth, mheight;
int pt;
byte[] byteAry;
int totbyte;
bool demo;
short minVericode_length;
BitmapData bitmapData;
Rectangle rect;
Pen RedPen = new Pen(Color.Lime, 3);
bool License;
public Form1()
{
InitializeComponent();
}
bool openCamear = false;//控制相机开关
GrabImage grabimg = new GrabImage();//实例化GrabImage类
//连接相机
private void button1_Click(object sender, EventArgs e)
{
if (openCamear == false)
{
openCamear = true;
grabimg.open();//调用open方法
textBox1.AppendText("相机连接成功!" + "\r\n");
}
else
{
MessageBox.Show("相机已打开!");
}
}
//单次采集图片
private void button2_Click(object sender, EventArgs e)
{
if (openCamear == true)
{
timer1.Enabled = false;
Bitmap img = grabimg.grabimage();
listBox1_SelectedIndexChanged(img);
}
else
{
MessageBox.Show("相机未打开!");
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
//退出
private void button4_Click(object sender, EventArgs e)
{
System.Environment.Exit(0);
}
//连续采集图片
private void button5_Click(object sender, EventArgs e)
{
if (openCamear == true)
{
timer1.Enabled = true;
}
else
{
MessageBox.Show("相机未打开!");
}
}
//关闭相机
private void button6_Click(object sender, EventArgs e)
{
if (openCamear == true)
{
openCamear = false;
timer1.Enabled = false;
grabimg.close();
}
else
{
MessageBox.Show("相机已关闭!");
}
}
//获取图片
private void timer1_Tick(object sender, EventArgs e)
{
Bitmap img= grabimg.grabimage();
listBox1_SelectedIndexChanged(img);
}
//加载图片
private void button3_Click_1(object sender, EventArgs e)
{
//选择文件
OpenFileDialog dialog = new OpenFileDialog();
dialog.Multiselect = false;//该值确定是否可以选择多个文件
dialog.Title = "打开文件";
dialog.Filter = "图片|*.jpg;*.png;*.gif;*.jpeg;*.bmp";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string file = dialog.FileName;
Bitmap img = (Bitmap)Image.FromFile(file);
listBox1_SelectedIndexChanged(img);
}
}
private void listBox1_SelectedIndexChanged(Bitmap img)
{
//Bitmap img;
int[] ptr = new int[2];
byte[] tmp_data;
int i;
int j;
rect = new Rectangle(0, 0, img.Width, img.Height);
pictureBox1.Image = img;
pictureBox1.Refresh();
mwidth = img.Width;
mheight = img.Height;
switch (img.PixelFormat)
{
case PixelFormat.Format8bppIndexed:
totbyte = img.Width * img.Height;
byteAry = new byte[totbyte];
bitmapData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
ptr[0] = VarPtr(byteAry);
ptr[1] = bitmapData.Scan0.ToInt32();
if (mwidth % 4 == 0)
{
CopyMemory(ptr[0], ptr[1], totbyte);
}
else
{
for (i = 0; i < mheight; i += 1)
{
CopyMemory(ptr[0], ptr[1], mwidth);
ptr[0] += mwidth;
ptr[1] += bitmapData.Stride;
}
}
img.UnlockBits(bitmapData);
break;
case PixelFormat.Format24bppRgb:
totbyte = img.Width * img.Height * 3;
tmp_data = new byte[totbyte];
byteAry = new byte[totbyte / 3];
bitmapData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
ptr[0] = VarPtr(tmp_data);
ptr[1] = bitmapData.Scan0.ToInt32();
if (mwidth % 4 == 0)
{
CopyMemory(ptr[0], ptr[1], totbyte);
}
else
{
for (i = 0; i < mheight; i += 1)
{
CopyMemory(ptr[0], ptr[1], mwidth * 3);
ptr[0] += mwidth * 3;
ptr[1] += bitmapData.Stride;
}
}
img.UnlockBits(bitmapData);
j = 0;
for (i = 0; i < totbyte; i += 3)
{
byteAry[j] = tmp_data[i];
j++;
}
break;
}
pt = VarPtr(byteAry);
Chk_Vericode();
}
//指针地址
private int VarPtr(object obj)
{
int returnValue;
GCHandle GC = GCHandle.Alloc(obj, GCHandleType.Pinned);
returnValue = GC.AddrOfPinnedObject().ToInt32();
GC.Free();
return returnValue;
}
private void Chk_Vericode()
{
short intRetCode = 0;
string pucUserData = "";
int pucMono;
short[] vcCorners = new short[8];
Point[] UL = new Point[2];
Point[] UR = new Point[2];
Point[] LL = new Point[2];
Point[] LR = new Point[2];
bool fg;
int t1;
int t2;
Bitmap img1;
Graphics g;
pucMono = pt;
t1 = Environment.TickCount;
fg = Decode_Vericode((short)mwidth, (short)mheight, pucMono, ref pucUserData, ref vcCorners, ref intRetCode, demo, minVericode_length);
t2 = Environment.TickCount;
t2 = ((t2 < t1) ? (int)(49.7 * 86400000 + t2) : t2);
if (fg)
{
UL[0].X = vcCorners[0];
UL[0].Y = mheight - vcCorners[1] - 1;
UL[1].X = vcCorners[2];
UL[1].Y = mheight - vcCorners[3] - 1;
UR[0].X = vcCorners[2];
UR[0].Y = mheight - vcCorners[3] - 1;
UR[1].X = vcCorners[6];
UR[1].Y = mheight - vcCorners[7] - 1;
LL[0].X = vcCorners[6];
LL[0].Y = mheight - vcCorners[7] - 1;
LL[1].X = vcCorners[4];
LL[1].Y = mheight - vcCorners[5] - 1;
LR[0].X = vcCorners[4];
LR[0].Y = mheight - vcCorners[5] - 1;
LR[1].X = vcCorners[0];
LR[1].Y = mheight - vcCorners[1] - 1;
img1 = new Bitmap(mwidth, mheight);
g = Graphics.FromImage(img1);
g.DrawImage(pictureBox1.Image, 0, 0, mwidth, mheight);
g.DrawLine(RedPen, UL[0].X, UL[0].Y, UL[1].X, UL[1].Y);
g.DrawLine(RedPen, UR[0].X, UR[0].Y, UR[1].X, UR[1].Y);
g.DrawLine(RedPen, LL[0].X, LL[0].Y, LL[1].X, LL[1].Y);
g.DrawLine(RedPen, LR[0].X, LR[0].Y, LR[1].X, LR[1].Y);
Font font = new System.Drawing.Font("宋体", 18);
SolidBrush brush = new SolidBrush(Color.Lime);
g.DrawString(pucUserData, font, brush, LR[1].X, LR[1].Y);
pictureBox1.Image = img1;
textBox1.AppendText( "\r\n\r\nCode : " + pucUserData);
}
else
{
textBox1.AppendText( "\r\n\r\nCode : No Data Decoded");
}
//textBox1.Text += "\r\n\r\nCount Time : " + (System.Convert.ToString((double)(t2 - t1))) + " ms";
textBox1.AppendText("\r\n\r\nCount Time : " + (System.Convert.ToString((double)(t2 - t1))) + " ms");
}
private bool Decode_Vericode(short xSize, short ySize, int pucMono, ref string pucUserData, ref short[] vcCorners, ref short intRetCode, bool demo, short minVericode_length)
{
bool returnValue;
short m = 0;
short n;
short i;
short j;
short k;
StringBuilder UserData = new StringBuilder();
bool fg;
string s;
fg = false;
k = 4;
n = 2;
for (i = 1; i >= 0; i--)
{
for (m = 0; m <= 1; m++)
{
UserData = new StringBuilder(4096);
j = (short)(1 << n);
intRetCode = vcRead(xSize, ySize, pucMono, UserData, i, ref vcCorners[7], k, j, m);
if (intRetCode == 1)
{
if (Chk_Data(UserData, demo, minVericode_length))
{
GetSymbolCorners(ref vcCorners[0]);
fg = true;
}
}
if (fg)
{
break;
}
}
if (fg)
{
break;
}
}
if (!fg)
{
for (i = 1; i >= 0; i--)
{
for (k = 1; k <= 4; k++)
{
for (n = 1; n <= 4; n++)
{
for (m = 0; m <= 1; m++)
{
UserData = new StringBuilder(4096);
j = (short)(1 << n);
intRetCode = vcRead(xSize, ySize, pucMono, UserData, i, ref vcCorners[0], k, j, m);
if (intRetCode == 1)
{
if (Chk_Data(UserData, demo, minVericode_length))
{
GetSymbolCorners(ref vcCorners[0]);
fg = true;
}
}
if (fg)
{
break;
}
}
if (fg)
{
break;
}
}
if (fg)
{
break;
}
}
if (fg)
{
break;
}
}
}
if (!fg)
{
for (i = 1; i >= 0; i--)
{
for (k = 5; k <= 8; k++)
{
for (n = 1; n <= 4; n++)
{
for (m = 0; m <= 1; m++)
{
UserData = new StringBuilder(4096);
j = (short)(1 << n);
intRetCode = vcRead(xSize, ySize, pucMono, UserData, i, ref vcCorners[0], k, j, m);
if (intRetCode == 1)
{
if (Chk_Data(UserData, demo, minVericode_length))
{
GetSymbolCorners(ref vcCorners[0]);
fg = true;
}
}
if (fg)
{
break;
}
}
if (fg)
{
break;
}
}
if (fg)
{
break;
}
}
if (fg)
{
break;
}
}
}
// textBox1.Text += "Vericode";
if (fg)
{
s = UserData.ToString();
pucUserData = s;
// textBox1.Text += "Vericode SampleWidth : " + k.ToString() + " BitsPerCell : " + (1 << n).ToString() + " Prefiltering : " + m.ToString();
}
returnValue = fg;
return returnValue;
}
private bool Chk_Data(StringBuilder DataCode, bool demo, short minVericode_length)
{
bool returnValue;
short i;
short n;
string s;
string s1;
returnValue = true;
s = DataCode.ToString();
n = (short)s.Length;
if (n < minVericode_length)
{
returnValue = false;
return returnValue;
}
for (i = 1; i <= n; i++)
{
s1 = s.Substring(i - 1, 1);
if (s1 == "?" && !demo && License)
{
returnValue = false;
break;
}
}
return returnValue;
}
private void hWindowControl1_HMouseMove(object sender, HMouseEventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
}
}
4.链接相机类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
namespace VeriCode_Demo
{
class GrabImage
{
HTuple hv_AcqHandle; //打开相机窗口的引用句柄
HObject ho_Image;//定义图片变量
HTuple imageWidth, imageHeight;//定义宽高
[DllImport("kernel32.dll")]
public static extern void CopyMemory(int Destination, int add, int Length);
public void open()
{
try
{
HOperatorSet.GenEmptyObj(out ho_Image);// 初始化本地图像空间的变量
//打开本地相机
HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default", "003053357e00_Basler_acA250020gm",
0, -1, out hv_AcqHandle);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "GainSelector", "All");
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "GainRaw", 279);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "BlackLevelRaw", 30);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "Gamma", 0.929993);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ReverseX", 0);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerMode", "Off");
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "Width", 800);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "TriggerActivation", "RisingEdge");
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "Height", 600);
//开始采集图像
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("打开相机失败!");//报错
}
}
//构造单次采集图像方法
public Bitmap grabimage()
{
//采集图像
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
//转成黑白图像
HOperatorSet.Rgb1ToGray(ho_Image, out ho_Image);
Bitmap img;
HObject2Bpp8(ho_Image, out img);
return img;
}
//关闭相机,释放内存
public void close()
{
ho_Image.Dispose();
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
}
public static void HObject2Bpp24Net45(HObject image, out Bitmap res)
{
try
{
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);
int imglength = width * height;
unsafe
{
byte* bptr = (byte*)bitmapData.Scan0;
byte* r = ((byte*)hred.L);
byte* g = ((byte*)hgreen.L);
byte* b = ((byte*)hblue.L);
for (int i = 0; i < imglength; 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);
}
catch (Exception ex)
{
res = null;
throw ex;
}
}
private static void HObject2Bpp8(HObject image, out Bitmap res)
{
try
{
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);
}
catch (Exception ex)
{
res = null;
throw ex;
}
}
}
}
https://download.csdn.net/download/qq_33228039/20643345