c# 链接相机 vericode解码小程序

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vericode解码库是一种用于解码验证码的工具库。验证码是用于识别用户是真人还是机器的一种验证方式,常见于登录、注册和数据提交等场景中。验证码通常由图像、字母或数字组成,其目的是将信息加密,使其难以被计算机自动识别。 Vericode解码库通过使用图像处理和机器学习算法,对验证码进行解码。首先,将验证码图像转换为计算机可以理解和处理的数据格式,比如二进制或图片像素数组。然后,利用图像处理算法对图像进行预处理,例如降噪、二值化和去除干扰线等操作,以提高验证码的可读性。 下来,使用机器学习算法对验证码进行识别。机器学习算法可以通过对训练集的学习,从而获取对验证码的认知能力。通过将已知标签(即验证码的真实值)与其对应的图像进行训练,算法可以学习到识别验证码的规则和特征。然后,将这些规则和特征应用于解码库中的验证码图像,从而识别出验证码的内容。 Vericode解码库的应用非常广泛。它可以用于包含验证码的网站和应用程序,通过自动化解码过程,提高用户的使用体验和操作效率。同时,它可以用于数据收集和分析,帮助用户处理大量的验证码,例如对数据进行爬取、群发邮件或短信验证等。 总之,Vericode解码库是一种用于解码验证码的工具库。它通过图像处理和机器学习算法,将加密的验证码转化为可理解和可识别的文本形式,提高用户体验、操作效率和数据处理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值