海康gige工业相机无驱动取像突破(c#实现,版本更新,你也可以移植到linux下去用)

news2024/11/16 9:18:00

我们前面有一个版本,没有整理,只能是500万海康gige工业相机无驱动取像成功(黑白相机gm)。

这里,版本更新了,可以不是500万,200万,80万也可以,你可以去试一试,我手头没有200万,80万的相机,有使用的,可以反馈一下结果,也就是说,写了一个通用版本,黑白相机,海康gige工业相机,你可以不安装任何驱动就能取像,所以呢?你可以移植成c语言版本,也可以在linux下,没有驱动的情况下,跑起来,想起来,还是很开心的,更新如下:

第一,界面(为了放入截图,我轻微整理了一下):

第二,代码(不引用加载用任何动态库,打开c#,copy进去直接用):

1,获取ip地址按钮:

  //get local ip
        byte[] localip;
        byte[] camip;
        byte portgao8wei;
        byte portdi8wei;
        private void button1_Click(object sender, EventArgs e)
        {
            //iplocal = IPAddress.Parse("192.168.21.123");
            //ipremote = IPAddress.Parse("192.168.21.54");
            iplocal = IPAddress.Parse(textBox1.Text);
            localip = iplocal.GetAddressBytes();
            ipremote = IPAddress.Parse(textBox2.Text);
            camip = ipremote.GetAddressBytes();

            int value = Convert.ToInt32(textBox11.Text);
             portgao8wei= (byte)(value >> 8);
             portdi8wei = (byte)(value);
        }
       
        UdpClient GVCPsocket = new UdpClient(3956);

2,gvcp通过3956第一次通信,按钮代码:

 //gvcp tongguo3956 diyici tongxin
        private void button2_Click(object sender, EventArgs e)
        {
            byte[] sendbuff = new byte[12] { 0x42, 0x01, 0x00, 0x02, 0x00, 0x00, 0, 1, 0, 0, 0, 0 };

            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
            IPEndPoint localtarget = new IPEndPoint(iplocal, 3956);
            GVCPsocket.Send(sendbuff, 12, remotetarget);

            Thread.Sleep(200);

            byte[] buf = GVCPsocket.Receive(ref localtarget);//44,45,46,47
            textBox3.Text = buf[44].ToString()+"."+buf[45].ToString()+"."+buf[46].ToString()+"."+buf[47].ToString();
        }
3,gvcp通过3956获取宽度,按钮代码:

  private void button3_Click(object sender, EventArgs e)
        {
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
            IPEndPoint localtarget = new IPEndPoint(iplocal, 3956); ;
            byte[] sendbuff = new byte[12] {   0x42, 0x01, 0x00, 0x80, 0x00, 0x04,
        0x00, 0x91, 0x00, 0x03, 0x03, 0x60 };
        

            GVCPsocket.Send(sendbuff, 12, remotetarget);

            Thread.Sleep(200);

            byte[] camwidth = GVCPsocket.Receive(ref localtarget);//width=0x0a20=2592
            int width = (camwidth[10] << 8) | camwidth[11];
            textBox4.Text = width.ToString();
            imgW = width;
        }
        int imgW = 0;
        int imgH = 0;

4,gvcp通过3956获取高度,按钮代码:

 private void button4_Click(object sender, EventArgs e)
        {
            IPEndPoint localtarget = new IPEndPoint(IPAddress.Any, 3956);
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
           // IPEndPoint remotetarget = new IPEndPoint(IPAddress.Parse("192.168.21.54"), 3956);
            byte[] sendbuff = new byte[12] {   0x42, 0x01, 0x00, 0x80, 0x00, 0x04,
        0x00, 0x92, 0x00, 0x03, 0x03, 0xa0 };

            GVCPsocket.Send(sendbuff, 12, remotetarget);

            Thread.Sleep(200);

            byte[] camheight = GVCPsocket.Receive(ref localtarget);//h=0x0798=1944
            int height = (camheight[10] << 8) | camheight[11];
            textBox5.Text = height.ToString();
            imgH = height;
        }

5,gvcp通过3956获取offsetx,按钮代码:

   private void button6_Click(object sender, EventArgs e)
        {
            IPEndPoint localtarget = new IPEndPoint(IPAddress.Any, 3956);
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
         //   IPEndPoint remotetarget = new IPEndPoint(IPAddress.Parse("192.168.21.54"), 3956);
            byte[] sendbuff = new byte[12] {   0x42, 0x01, 0x00, 0x80, 0x00, 0x04,
        0x00, 0x93, 0x00, 0x03, 0x03, 0x0e0 };

            GVCPsocket.Send(sendbuff, 12, remotetarget);

            Thread.Sleep(200);

            byte[] camoffsetx = GVCPsocket.Receive(ref localtarget);//1

            int offsetx = (camoffsetx[10] << 8) | camoffsetx[11];
            textBox7.Text = offsetx.ToString();
        }

6,gvcp通过3956获取offsety,按钮代码:

  private void button5_Click(object sender, EventArgs e)
        {
            IPEndPoint localtarget = new IPEndPoint(IPAddress.Any, 3956);
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
            //IPEndPoint remotetarget = new IPEndPoint(IPAddress.Parse("192.168.21.54"), 3956);
            byte[] sendbuff = new byte[12] {  0x42, 0x01, 0x00, 0x80, 0x00, 0x04,
        0x00, 0x94, 0x00, 0x03, 0x04, 0x20};

            GVCPsocket.Send(sendbuff, 12, remotetarget);

            Thread.Sleep(100);

            byte[] camoffsety = GVCPsocket.Receive(ref localtarget);//1
            int offsety = (camoffsety[10] << 8) | camoffsety[11];
            textBox6.Text = offsety.ToString();
        }

7,gvcp通过3956获取mono,按钮代码:

 private void button7_Click(object sender, EventArgs e)
        {
            IPEndPoint localtarget = new IPEndPoint(IPAddress.Any, 3956);
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
           // IPEndPoint remotetarget = new IPEndPoint(IPAddress.Parse("192.168.21.54"), 3956);
            byte[] sendbuff = new byte[12] {  0x42, 0x01, 0x00, 0x80, 0x00, 0x04,
        0x00, 0x95, 0x00, 0x03, 0x06, 0x10 };

            GVCPsocket.Send(sendbuff, 12, remotetarget);

            Thread.Sleep(50);

            byte[] cammono8 = GVCPsocket.Receive(ref localtarget);//=01080001

            int mono8 = (cammono8[10] << 8) | cammono8[11];
            if(1==mono8)
                textBox8.Text = "0x01080001";
        }

8,gvcp通过3956设置心跳,按钮代码:

   bool 可以控制 = false;
        bool 可以设置心跳 = false;
        string 反馈信息 = "";
        private void button8_Click(object sender, EventArgs e)
        {
            反馈信息 = "";
            textBox9.Text = "";
            IPEndPoint localtarget = new IPEndPoint(IPAddress.Any, 3956);
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
            byte[] sendbuff = new byte[12] { 0x42, 0x01, 0x00, 0x80, 0x00, 0x04,
        0x01, 0x28, 0x00, 0x00, 0x0a, 0x00 };

            GVCPsocket.Send(sendbuff, 12, remotetarget);

            Thread.Sleep(50);

            byte[] retfree = GVCPsocket.Receive(ref localtarget);// //如果返回如此[11]=0,its free can be control

            if (retfree[11] == 0)
            {
                可以控制 = true;
                反馈信息 += "返回为零,可以控制寄存器"+"\r\n";
            }
            if (可以控制)
            {
                //开始控制,向寄存器写入0x02
                sendbuff = new byte[16] { 0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
        0x01, 0x29, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x02 };
                GVCPsocket.Send(sendbuff, 16, remotetarget);

                Thread.Sleep(50);
                retfree = GVCPsocket.Receive(ref localtarget);// //如果返回如此[11]=1,开始设置心跳

                if (retfree[11] == 1)
                {
                    可以设置心跳 = true;
                    反馈信息 += "控制寄存器写入0x02成功" + "\r\n";
                }
            }


            if (可以设置心跳)
            {
                byte 增加1 = 0x2d;
                for (int i = 0; i < 5; i++)//怎样判断gvcpReply.status==success?如果在5次内设置成功了,就要跳出来
                {
                    byte[] sendbuff16 = new byte[16] { 0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
        0x01, 增加1, 0x00, 0x00, 0x09, 0x38, 0x00, 0x00, 0x27, 0x10 };

                    GVCPsocket.Send(sendbuff16, 16, remotetarget);

                    Thread.Sleep(500);

                    byte[] ret12 = GVCPsocket.Receive(ref localtarget);
                    if (ret12[11] == 1)
                    {
                        反馈信息 += "心跳写入成功" + "\r\n";
                        //成功了?
                        i = 5;
                        break;
                    }
                    增加1++;
                }
            }
            backgroundWorker1.RunWorkerAsync();//启动心跳
        }

9,我们这里第八步,使用了一个异步线程backgroundWorker1,代码如下:

 bool m_bgvsp = false;
        Socket socketRxRaw;
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            byte hello增加1 = 0x2d;
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
            m_bgvsp = true;
            while (m_bgvsp)
            {

                byte[] sendbuff16 = new byte[16] { 0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
        0x01, hello增加1, 0x00, 0x00, 0x09, 0x38, 0x00, 0x00, 0x27, 0x10 };

                GVCPsocket.Send(sendbuff16, 16, remotetarget);

                hello增加1++;

                Thread.Sleep(50);
            }
        }

10,gvsp取像,按钮代码如下:

  byte[][] buffer5038848 = new byte[2][];
        byte[] m_buff9000 = new byte[9000];
        private void button9_Click(object sender, EventArgs e)
        {
            if (m_bgvsp)
            {
                //1,开始控制,向寄存器写入GevSCPHostPort
                IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);

                byte[] sendbuff16 = new byte[16] { 0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
                    
                    0x01, 0x2e, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, portgao8wei, portdi8wei};//写入端口port=63378
        //0x01, 0x2e, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0f7, 0x92};//写入端口port=63378

                GVCPsocket.Send(sendbuff16, 16, remotetarget);//返回1,才可以下一步
                Thread.Sleep(50);
                textBox11.Enabled = false;
                //2,开始控制,向寄存器写入GevSCDA
               
                sendbuff16 = new byte[16] { 0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
           //0x01, 0x2f, 0x00, 0x00, 0x0d, 24, 192, 168, 21, 123};
             0x01, 0x2f, 0x00, 0x00, 0x0d, 24, localip[0], localip[1], localip[2], localip[3]};
                //写入ip192.168.20.48
                GVCPsocket.Send(sendbuff16, 16, remotetarget);//返回1,才可以下一步
                Thread.Sleep(50);
                反馈信息 += "GevSCPHostPort写入63378成功" + "\r\n";

               // textBox10.Enabled = false;
                /* 3, <Integer Name="ExposureTime_RegAddr">
                                              <Value>
                                                0x00030b04
                                              </Value>*/
                sendbuff16 = new byte[16] {0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
        0x03, 0x2f, 0x00, 0x03, 0x0b, 0x04,0,0,0x61,0x0a8};
                //写入曝光值25000
                //   0x03, 0x2f, 0x00, 0x03, 0x0b, 0x04,0,0,0x3a,0x98}; //写入曝光值15000
                GVCPsocket.Send(sendbuff16, 16, remotetarget);//返回1,才可以下一步
                Thread.Sleep(50);
                反馈信息 += "GevSCDA写入192, 168, 21, 123成功" + "\r\n";
                //4,开始控制,向寄存器写入 var gevSCPSPacketSize = (await Gvcp.GetRegister(nameof(GvcpRegister.GevSCPSPacketSize))).pValue;//地址0x0d04
                sendbuff16 = new byte[16] {0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
            0x01, 0x31, 0x00, 0x00, 0x0d,  0x04, 64, 0, 0x1f, 0x0e4};
                //写入mtu8164
                GVCPsocket.Send(sendbuff16, 16, remotetarget);//返回1,才可以下一步
                Thread.Sleep(50);
                反馈信息 += "写入曝光值25000成功" + "\r\n";
                //5,开始控制,向寄存器写入  acquisitionStart.SetValueAsync(1).ConfigureAwait(false)) as GvcpReply
                sendbuff16 = new byte[16] {0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
        0x01, 0x32, 0x00, 0x03, 0x08, 4, 0, 0, 0, 1};
                //写入mtu8164
                GVCPsocket.Send(sendbuff16, 16, remotetarget);//返回1,才可以下一步,进入异步线程接受图像
                Thread.Sleep(50);
                反馈信息 += "写入mtu8164成功" + "\r\n";
                IPEndPoint localtarget = new IPEndPoint(IPAddress.Any, 3956);
                byte[] ret12 = GVCPsocket.Receive(ref localtarget);


                if (ret12[11] == 0x01)
                {
                    反馈信息 += "写入acquisitionStart==1成功" + "\r\n";
                    //buffer5038848[0] = new byte[2592 * 1944];
                    //buffer5038848[1] = new byte[5038848];
                    buffer5038848[0] = new byte[imgW * imgH];
                    buffer5038848[1] = new byte[imgW * imgH];
                    一帧分包 = (imgW * imgH) / 8128;
                    帧分包余数 = imgW * imgH - 一帧分包 * 8128;
                    //destptrbig = Marshal.AllocHGlobal(5038848);
                    destptrbig = Marshal.AllocHGlobal(imgW * imgH);
                    destptrbig1 = Marshal.AllocHGlobal(imgW * imgH);
                    //初始化接受套接字
                    // 设置UDP服务器的端点

                    socketRxRaw = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                  //  socketRxRaw.Bind(new IPEndPoint(IPAddress.Any, 63378));// ProtocolType.Udp
                    int hello= Convert.ToInt32(textBox11.Text);
                  socketRxRaw.Bind(new IPEndPoint(IPAddress.Any,hello ));
                    //   IPEndPoint remotetargetRx = new IPEndPoint(IPAddress.Parse("192.168.20.54"), 63378);
                    //    IPEndPoint localtargetRx = new IPEndPoint(IPAddress.Any, 63378);

                    socketRxRaw.ReceiveTimeout = 1000;
                    //One full hd image with GVSP2.0 Header as default, it will be updated for image type
                    //socketRxRaw.ReceiveBufferSize = (int)(1920 * 1100);
                    socketRxRaw.ReceiveBufferSize = (int)(2* 2500 * 2024);

                    创建缓冲区以接收数据
                    //byte[] bytess = new byte[socketRxRaw.ReceiveBufferSize];
                    //EndPoint remoteEP = (EndPoint)groupEP;

                    //接受第0帧,测试帧
                    //  socketRxRaw.Receive(m_buff9000);
                    // 等待广播数据
                    //int bytesRec = socketRxRaw.ReceiveFrom(bytess, ref remoteEP);
                    //if (bytess[7]==0)
                    {
                        backgroundWorker2.RunWorkerAsync();
                        //   timer1.Start();
                        反馈信息 += "gvsp开始取像" + "\r\n";
                        textBox9.Text += 反馈信息;
                    }

                }
            }
        }

11,这里第十步,使用了异步线程2,backgroundWorker2,其调用代码如下(这里是接收图像步骤,这里不仅仅500万相机可以用,这里没写死,写的通用了):

 bool yongzhen = true;
        int 一帧分包 = 0;
        int 帧分包余数 = 0;
        int frame = 0;
        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            // IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 63378);
            //EndPoint remoteEP=(EndPoint)groupEP;
            frame = 0;
            do
            {
                try
                {
                    int changdu = socketRxRaw.Receive(m_buff9000);//与函数ReceiveFrom结果一样
                    if (changdu > 1000)
                    {
                        int packetIDperframe = (m_buff9000[6] << 8) | m_buff9000[7];
                        if (packetIDperframe == 0) continue;

                        int jiou = frame % 2;
                        switch (jiou)
                        {
                            case 0:
                                {
                                    //if (packetIDperframe == 620)//一帧分包
                                    if (packetIDperframe == 一帧分包 + 1)//一帧分包
                                    {
                                        //System.Runtime.InteropServices.Marshal.Copy(m_buff9000, 8, destptrbig + (packetIDperframe - 1) * 8128, 7616);//结果与上面一样,有横线 }
                                        // 帧分包余数
                                        System.Runtime.InteropServices.Marshal.Copy(m_buff9000, 8, destptrbig + (packetIDperframe - 1) * 8128, 帧分包余数);
                                        System.Runtime.InteropServices.Marshal.Copy(destptrbig, buffer5038848[0], 0, imgH * imgW);
                                        showbuffer2pict(buffer5038848[0], imgW, imgH, pictureBox1);//不是bmp z序的,正常的202302061722
                                        //System.Runtime.InteropServices.Marshal.Copy(destptrbig, buffer5038848[0], 0, 5038848);
                                        //showbuffer2pict(buffer5038848[0], 2592, 1944, pictureBox1);//不是bmp z序的,正常的202302061722
                                        frame++;
                                    }
                                    else
                                    {
                                        //destptrbig202403301518,为什么c#有横线,c版本没有,代码是一致的
                                        System.Runtime.InteropServices.Marshal.Copy(m_buff9000, 8, destptrbig + (packetIDperframe - 1) * 8128, 8128);//结果与上面一样,有横线 }

                                    }
                                }
                                break;
                            case 1:
                                {
                                    //if (packetIDperframe == 620)//一帧分包
                                    if (packetIDperframe == 一帧分包 + 1)//一帧分包
                                    {
                                        //System.Runtime.InteropServices.Marshal.Copy(m_buff9000, 8, destptrbig + (packetIDperframe - 1) * 8128, 7616);//结果与上面一样,有横线 }
                                        // 帧分包余数
                                        System.Runtime.InteropServices.Marshal.Copy(m_buff9000, 8, destptrbig1 + (packetIDperframe - 1) * 8128, 帧分包余数);
                                        System.Runtime.InteropServices.Marshal.Copy(destptrbig1, buffer5038848[0], 0, imgH * imgW);
                                        showbuffer2pict(buffer5038848[0], imgW, imgH, pictureBox1);//不是bmp z序的,正常的202302061722
                                        //System.Runtime.InteropServices.Marshal.Copy(destptrbig, buffer5038848[0], 0, 5038848);
                                        //showbuffer2pict(buffer5038848[0], 2592, 1944, pictureBox1);//不是bmp z序的,正常的202302061722
                                        frame++;
                                    }
                                    else
                                    {
                                        //destptrbig202403301518,为什么c#有横线,c版本没有,代码是一致的
                                        System.Runtime.InteropServices.Marshal.Copy(m_buff9000, 8, destptrbig1 + (packetIDperframe - 1) * 8128, 8128);//结果与上面一样,有横线 }

                                    }
                                }
                                break;
                            default:
                                break;
                        }
                        
                    }

                }
                catch (Exception ee)
                { }

            } while (yongzhen);
            //
        }

12,下面是如何关闭相机:即就是“gvsp取像结束”按键的代码:

   private void button10_Click(object sender, EventArgs e)
        {
            IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
            //关闭相机控制,向寄存器写入0x00
            byte[]    sendbuff = new byte[16] { 0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
        0x01, 0x29, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 };
                GVCPsocket.Send(sendbuff, 16, remotetarget);
                Thread.Sleep(50);
            //duchulai shi 0
                IPEndPoint localtarget = new IPEndPoint(IPAddress.Any, 3956);
              //  IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
               // byte[]
                    sendbuff = new byte[12] { 0x42, 0x01, 0x00, 0x80, 0x00, 0x04,
        0x01, 0x28, 0x00, 0x00, 0x0a, 0x00 };

                GVCPsocket.Send(sendbuff, 12, remotetarget);

                Thread.Sleep(50);

                byte[] retfree = GVCPsocket.Receive(ref localtarget);// //如果返回如此[11]=0,its free can be control

                if (retfree[11] == 0)
                {
                    yongzhen = false;
                    backgroundWorker2.Dispose();
                    反馈信息 += "gvsp取像结束" + "\r\n";
                    textBox9.Text += 反馈信息;
                }
        }

13,关于海康相机曝光的控制:使用了一个文本框来更改,代码如下:

     private void textBox10_TextChanged(object sender, EventArgs e)//genggai baoguang202407231428
        {
            //float value = (float)(Convert.ToDouble(textBox3.Text));//改为880000
            //int hello = device.MV_CC_SetExposureTime_NET(value);//感觉有效果202208060942

            int value = Convert.ToInt32(textBox10.Text);
            byte gao8wei = (byte)(value >> 8);
            byte di8wei = (byte)(value);
            /* 3, <Integer Name="ExposureTime_RegAddr">
                                              <Value>
                                                0x00030b04
                                              </Value>*/
          byte[]  sendbuff16 = new byte[16] {0x42, 0x01, 0x00, 0x82, 0x00, 0x08,
        //0x03, 0x2f, 0x00, 0x03, 0x0b, 0x04,0,0,0x61,0x0a8};
         0x03, 0x2f, 0x00, 0x03, 0x0b, 0x04,0,0,gao8wei,di8wei};
            //写入曝光值25000
          IPEndPoint remotetarget = new IPEndPoint(ipremote, 3956);
            //   0x03, 0x2f, 0x00, 0x03, 0x0b, 0x04,0,0,0x3a,0x98}; //写入曝光值15000
            GVCPsocket.Send(sendbuff16, 16, remotetarget);//返回1,才可以下一步
            Thread.Sleep(50);
        }

以为不多,写了不少!还有最后一个图像显示函数:

      void showbuffer2pict(byte[] buffer, int ww, int hh, PictureBox destImg)
        {          
            int mod = ww % 4;//解决四位对齐问题20150716
            int temproiw = ww + (4 - mod) % 4;//其实这都是和显示相关,处理图像其实不必考虑,
            //顯示
            byte[] cutvalues = new byte[temproiw * hh * 3];
            int bytes = temproiw * hh * 3;
            Bitmap cutPic24 = new Bitmap(temproiw, hh, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            BitmapData _cutPic = cutPic24.LockBits(new Rectangle(0, 0, temproiw, hh), ImageLockMode.ReadWrite,
                                                     cutPic24.PixelFormat);

            IntPtr ptr = _cutPic.Scan0;//得到首地址

            for (int i = 0; i < hh; i++)
            {
                for (int j = 0; j < ww; j++)
                {
                    int n = i * ww + j;
                    //int m = 3 * n;
                    int m = 3 * (i * temproiw + j);
                    cutvalues[m] = buffer[n];
                    cutvalues[m + 1] = buffer[n];
                    cutvalues[m + 2] = buffer[n];

                }
            }
            System.Runtime.InteropServices.Marshal.Copy(cutvalues, 0, ptr, bytes);
            cutPic24.UnlockBits(_cutPic);
            destImg.Image = cutPic24;
        }

最后,拍了个视频,供参考。

这个程序,c,c++版本都可以跑,我不懂linux,否则,我会去倒腾,哈哈!

linux一般会驱动千兆网卡,但一般不会驱动gige相机,想想就兴奋,要注意的是,linux下,可以用png图像显示或存盘,我在c语言下试过支持png图像的包,可以用,存了好几张图像,都是ok的。

我们的图像在byte【】数组里,linux下c或c++,你用指针,一个char*指针,他和这个byte【】是一样的,用过opencv,你就知道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++二分查找 树状数组】2424. 最长上传前缀

本文涉及的基础知识点 C二分查找 树状数组 LeetCode2424. 最长上传前缀 给你一个 n 个视频的上传序列&#xff0c;每个视频编号为 1 到 n 之间的 不同 数字&#xff0c;你需要依次将这些视频上传到服务器。请你实现一个数据结构&#xff0c;在上传的过程中计算 最长上传前缀…

“AI+Security”系列第2期(一):对抗!大模型自身安全的攻防博弈

近日&#xff0c;由安全极客、Wisemodel 社区和 InForSec 网络安全研究国际学术论坛联合主办的“AISecurity”系列第 2 期——对抗&#xff01;大模型自身安全的攻防博弈线上活动如期举行。本次活动邀请了君同未来创始人兼 CEO 韩蒙、前阿里云高级安全专家郑瀚、ChaMd5 AI 组负…

浏览器突然无法正常访问网页的解决方案

文章目录 1.问题描述&#xff1a;2.解决方案3.总结 1.问题描述&#xff1a; 浏览器之前是可以正常搜索的&#xff0c;但是这次打开显示无法正常访问&#xff0c;但是部分网页又是可以正常访问的 2.解决方案 1.搜索控制面板 2.点击网络和Internet 3.点击网络共享中心 4.点击…

大数据面试SQL(五):查询最近一笔有效订单

文章目录 查询最近一笔有效订单 一、题目 二、分析 三、SQL实战 四、样例数据参考 查询最近一笔有效订单 一、题目 现有订单表t5_order&#xff0c;包含订单ID&#xff0c;订单时间&#xff0c;下单用户&#xff0c;当前订单是否有效。 请查询出每笔订单的上一笔有效订…

Fanuc机床的数据采集解决方案

对于制造业而言随着工业数字化的发展&#xff0c;完善工厂信息化管理&#xff0c;消除信息孤岛是越来越多工控人关注的事情。其中不得不提到的就是CNC系统&#xff0c;科学的程序管理和规范可以减少机床辅助时间&#xff0c;提高机床利用效率&#xff1b;及时准确的获取机床实时…

线程池c代码实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、线程池是什么&#xff1f;二、代码示例总结 前言 线程池c代码简单实现&#xff1a; 大致思路如下&#xff1a; 一个管理线程轮询工作线程是否空闲&#xf…

程序员如何在人工智能时代保持核心竞争力

目录 1.概述 1.1. 技术深度与广度的平衡 1.2. 软技能的培养 1.3. 持续学习和适应性 1.4. 理解和应用AI 1.5. 伦理和责任意识 2.AI辅助编程对程序员工作的影响 2.1.AI工具对编码实践的积极影响 2.2.AI工具的潜在风险 2.3.如何平衡利与弊 3.程序员应重点发展的核心能力…

RabbitMQ docker安装

后台配置文件 rabbitmq:image: rabbitmq:latestcontainer_name: rabbitmqports:- "5672:5672" # RabbitMQ server port- "15672:15672" # RabbitMQ management console portenvironment:RABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: admin 若要打…

使用 Mojo 中的 Mandelbrot 和 Python 绘图

Mojo不仅非常适合编写高性能代码,而且还允许我们利用庞大的Python生态系统中的库和工具。通过无缝的Python互操作性,Mojo可以使用Python来做它擅长的事情,特别是gui,而不会牺牲关键代码的性能。让我们使用经典的Mandelbrot集合算法并在Mojo中实现它。 本教程展示了Mojo的两…

UE 选中框

【UE】框选功能_ue框选-CSDN博客 虚幻4 小功能教程系列-P33 覆盖物框选(框选场景里的物体)_哔哩哔哩_bilibili 步骤 先重载 UI中函数 OnPaint Position&#xff1a;起始位置 Size&#xff1a;大小 Brush: 选中框样式设置 在内容浏览器中新建一个“Slate笔刷” Tint&#x…

2023 江苏省第一届数据安全技术应用职业技能竞赛 决赛 部分wp

文章目录 一、前言比赛平台全貌题目附件及工具下载&#xff08;123网盘&#xff09; 二、参考文章三、题目&#xff08;解析&#xff09;一、内存取证-MemoryLife1、请给出内存镜像中黑客使用工具对外连接的IP地址及端口号是___________。&#xff08;格式为IP_PORT&#xff09…

Windows Server Backup(2016) 备份

Windows Server Backup(2016) 备份 1.使用 Windows Server Backup 备份 点击添加角色和功能&#xff0c;根据向导&#xff0c;添加 Windows Server Backup 功能。 添加完成后可通过 控制面板\系统和安全\管理工具 找到 Windows Server Backup&#xff0c;如下图 打开后如图&…

Openlayers6之地图覆盖物Overlay详解及使用,地图标注及弹窗查看详情(结合React)

demo案例&#xff1a;用户实现地图加载人员位置定位&#xff0c;并设置人员图片文字等标注&#xff0c;点击定位点查看人员详情。 主要通过ol/geom Point设置Style和ol/Overlay实现。主要实现步骤&#xff1a; 实现图文标注的实质是添加点时设置Ponit的样式&#xff0c;图片标…

浅谈安科瑞智慧用电系统在电气火灾中的应用

摘要&#xff1a;为了对电气火灾事故进行预测和预警&#xff0c;同时为了对电气火灾事故的应急救援提供 支持&#xff0c;将智慧用电监控系统应用于电气火灾中。该系统利用物联网、移动互联网、云平台、大数据技术&#xff0c;实现对电气线路电流、漏电、温度、谐波等参数进行…

leetcode日记(66)子集

实际上和上一题差不多&#xff0c;可以直接套用上一题回溯递归的函数写出来&#xff0c;复杂度比较高&#xff0c;因为是按照数字个数依次代入函数&#xff0c;然后通通放入一个vector中。 class Solution { public:vector<vector<int>> subsets(vector<int>…

Linux 实验基础环境准备(外网篇)

1.关闭禁用防火墙和selinux systemctl disable firewalld --now sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config2.保证可以连接外网 ping -c3 www.baidu.com 3.配置yum为阿里仓库并下载epel源 mkdir /etc/yum.repos.d/bak/; mv /etc/yum.repos.d/*.repo /e…

【AI-16】浅显易懂说一下RNN和Transformer

循环神经网络&#xff08;RNN&#xff09;曾经是自然语言处理领域的主流&#xff0c;但它们面临着长距离依赖和梯度消失等问题&#xff0c;限制了其在处理长文本序列时的表现。随后&#xff0c;Transformer模型的出现改变了这一局面。 循环神经网络&#xff08;RNN&#xff09…

实施MES管理系统的过程中可能会遇到的风险

在制造业的数字化转型浪潮中&#xff0c;MES管理系统的部署成为了企业提升生产效率、优化资源配置的关键一环。然而&#xff0c;这一过程的复杂性和潜在风险不容忽视。本文将从多个维度探讨实施MES管理系统的过程中可能面临的挑战&#xff0c;并提出一系列策略以应对这些挑战&a…

工作随记:我在OL8.8部署oracle rac遇到的问题

文章目录 一、安装篇问题1&#xff1a;[INS-08101] Unexpected error while executing the action at state:supportedosCheck问题1解决办法&#xff1a;问题2&#xff1a;[INS-06003] Failed to setup passwordless SSH connectivity with thefollowing nodeis): [xxxx1, xxxx…

天玑9400新猛料:CPU性能提升30%,同场景仅需8G3 30%功耗

年底的手机市场的新消息简直让人应接不暇&#xff0c;而其中最令人期待的&#xff0c;无疑是天玑9400旗舰芯。这款芯片据说性能提升了30%&#xff0c;在相同场景下功耗却降低到了8G3的30%。网友们纷纷表示&#xff1a;“发哥这次真的稳住了&#xff0c;天玑系列越来越给力&…