vericode解码小程序
- 1.程序主体
- 2.演示效果
- 3.检测类
- 4.链接相机类
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