发现海康的sdk不错,可以用海康,basler,大华工业相机,估计其他的也可以,有机会试一试!国产厉害,崛起了!赞一个,热情爆棚!且随窃喜!

首先下载海康工业相机的安装包,并安装,安装后如图,打开:

他的开发包和范例安装包路径如下:

参考里边的可以写你想要的程序,当然是打开相机取像了,我使用的是他的bmp位图方式(你懂的,存图是z字序的),图像是反的,我给颠倒过来了:(这是黑白相机c#范例,后续还有彩色相机的)

第一,初始化:果断注释掉以前basler的,只留海康

#region haikangcam
            // ch:枚举设备 | en:Enum device
            if (nDevIndex == -1) { MessageBox.Show("请选择相机"); return; }
            MyCamera.MV_CC_DEVICE_INFO_LIST stDevList = new MyCamera.MV_CC_DEVICE_INFO_LIST();
            nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE, ref stDevList);//| MyCamera.MV_USB_DEVICE
            MyCamera.MV_CC_DEVICE_INFO stDevInfo;
            for (Int32 i = 0; i < stDevList.nDeviceNum; i++)
            {
                stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));

if (MyCamera.MV_GIGE_DEVICE == stDevInfo.nTLayerType)
                {
                    MyCamera.MV_GIGE_DEVICE_INFO stGigEDeviceInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
                
                   string str= stGigEDeviceInfo.chModelName;              
                   bool youwu00 = str.Contains("gc");//彩色判断
                   bool youwu01 = str.Contains("gC");
                   bool youwu10 = str.Contains("Gc");
                   bool youwu11 = str.Contains("GC");
                   if (youwu00 || youwu01 || youwu10 || youwu11) { checkBoxBW.Checked = false; } else { checkBoxBW.Checked = true; }
                }
              
                stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MyCamera.MV_CC_DEVICE_INFO));
                // ch:创建设备 | en:Create device
                nRet = device.MV_CC_CreateDevice_NET(ref stDevInfo);
                // ch:打开设备 | en:Open device
                nRet = device.MV_CC_OpenDevice_NET();
                // ch:设置触发模式为off || en:set trigger mode as off
                if (MyCamera.MV_OK != device.MV_CC_SetEnumValue_NET("TriggerMode", 0))
                {
                  //控制台的,没用,删掉
                }
                device.MV_CC_SetEnumValue_NET("ExposureAuto", 0);
                float value = (float)(Convert.ToDouble(textBox3.Text));//改为880000
                int hello = device.MV_CC_SetExposureTime_NET(value);//感觉有效果202208060942
                // ch:开启抓图 | en:start grab
                nRet = device.MV_CC_StartGrabbing_NET();
                if (MyCamera.MV_OK != nRet)
                {
                 
                }

// ch:获取包大小 || en: Get Payload Size
                MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
                nRet = device.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);
                if (MyCamera.MV_OK != nRet)
                {
                   
                }
                nPayloadSize = stParam.nCurValue;
                pBufForDriver = Marshal.AllocHGlobal((int)nPayloadSize);
            }
            #endregion haikangcam

第二,上面第一句执行不了,返回了,所以问题在这里:

a,引用,using MvCamCtrl.NET;

b,声明变量, //ishaikang20211230
        MyCamera device = new MyCamera();
        int nRet = MyCamera.MV_OK;
        MyCamera.MVCC_INTVALUE stParam;
        UInt32 nPayloadSize;
        // int nCount = 0;
        IntPtr pBufForDriver;
        IntPtr pBufForSaveImage = IntPtr.Zero;
        MyCamera.MV_FRAME_OUT_INFO_EX FrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();

c,枚举相机,添加到combox:

//列举相机个数
            //  int nRet = MyCamera.MV_OK;
            //   MyCamera device = new MyCamera();

// ch:枚举设备 | en:Enum device
            MyCamera.MV_CC_DEVICE_INFO_LIST stDevList1 = new MyCamera.MV_CC_DEVICE_INFO_LIST();
            do
            {

int tempint = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref stDevList1);
                if (MyCamera.MV_OK != tempint)
                {
                  
                    break;
                }
             
                textBoxcamno.Text = stDevList1.nDeviceNum.ToString();
                if (0 == stDevList1.nDeviceNum)
                {
                    break;
                }

} while (false);

MyCamera.MV_CC_DEVICE_INFO stDevInfo;
            for (Int32 i = 0; i < stDevList1.nDeviceNum; i++)
            {
                stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList1.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));

if (MyCamera.MV_GIGE_DEVICE == stDevInfo.nTLayerType)
                {
                    MyCamera.MV_GIGE_DEVICE_INFO stGigEDeviceInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));

comboBoxCamSel.Items.Add(i.ToString());// + //":" + stGigEDeviceInfo.chSerialNumber +":"+ stGigEDeviceInfo.chModelName.ToString()+ 
                                                           //"\r\n";

}
            }

第三,万事具备,取像,连续取像,开一个timer,启动:

int ww = Convert.ToInt32(inputW.Text);//无论是2千万,还是200万,我只去1024*768
            int hh = Convert.ToInt32(inputH.Text);//无论是2千万,还是200万,我只去1024*768
            nRet = device.MV_CC_GetOneFrameTimeout_NET(pBufForDriver, nPayloadSize, ref FrameInfo, 1000);

第四,ok,完了,但要显示出来,并且把数据放入二维数组,需要花费功夫(这里先处理黑白相机,默认8位):

if (pBufForSaveImage == IntPtr.Zero)
                    {
                        pBufForSaveImage = Marshal.AllocHGlobal((int)(FrameInfo.nHeight * FrameInfo.nWidth * 3 + 2048));
                    }
                    MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX();
                    stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp;
                    stSaveParam.enPixelType = FrameInfo.enPixelType;
                    stSaveParam.pData = pBufForDriver;
                    stSaveParam.nDataLen = FrameInfo.nFrameLen;
                    stSaveParam.nHeight = FrameInfo.nHeight;
                    stSaveParam.nWidth = FrameInfo.nWidth;
                    stSaveParam.pImageBuffer = pBufForSaveImage;
                    stSaveParam.nBufferSize = (uint)(FrameInfo.nHeight * FrameInfo.nWidth * 3 + 2048);
                    stSaveParam.nJpgQuality = 80;
                    nRet = device.MV_CC_SaveImageEx_NET(ref stSaveParam);

byte[] data = new byte[stSaveParam.nImageLen];
                    Marshal.Copy(pBufForSaveImage, data, 0, (int)stSaveParam.nImageLen);

//以下是针对黑白相机的//这个黑白相机程序也是ok的,但与彩色相机程序有差别//20220427
                         byte[] tempdata2 = new byte[FrameInfo.nHeight * FrameInfo.nWidth];
                         for (int i = 0 + 1078; i < FrameInfo.nHeight * FrameInfo.nWidth + 1078; i++)
                         {

tempdata2[i - 1078] = data[i];

}
                         byte[] data2 = new byte[FrameInfo.nHeight * FrameInfo.nWidth];
                         for(int i=0;i<FrameInfo.nHeight;i++)
                             for (int j = 0; j <FrameInfo.nWidth ; j++)
                             {
                                 data2[i  *FrameInfo.nWidth + j] = tempdata2[(FrameInfo.nHeight - 1 - i) * FrameInfo.nWidth + j];
                             }
                     
                         int bytes = ww * hh * 3;
                         byte[] bufercopy = new byte[bytes];
                         Bitmap cutPic24 = new Bitmap(ww, hh,
                             System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                         BitmapData _cutPic = cutPic24.LockBits(new Rectangle(0, 0, ww, hh),
                             ImageLockMode.ReadWrite, cutPic24.PixelFormat);
                         IntPtr ptr = _cutPic.Scan0;//得到首地址

int yy = (FrameInfo.nHeight - hh) / 2;//FrameInfo.nHeight
                         int xx = (FrameInfo.nWidth - ww) / 2;// FrameInfo.nWidth
                         for (int ii = yy; ii < yy + hh; ii++)//图像复原,即由8位图变成24位图像
                         {
                             for (int j = xx; j < xx + ww; j++)
                             {//位图z序颠倒后,正常
                                 int n = ii * FrameInfo.nWidth + j;
                                 int k = (ii - yy) * ww + j - xx;
                                 int m = 3 * k;
                                 glob_buffer8[k] = checkBoxConvertBW.Checked ? (byte)(255 - data2[n]) : data2[n];//为什么可以,可以验证,可以分析202209231111
                               
                                 bufercopy[m] =  data2[n];
                                 bufercopy[m + 1] = data2[n];
                                 bufercopy[m + 2] = data2[n];
                              
                             }
                         }

showbuffer2pict(data2, FrameInfo.nWidth, FrameInfo.nHeight, pictureBoxrgb);

第五,解释showbuffer2pict函数:(主要针对黑白8为图像显示)

void showbuffer2pict(byte[] buffer, int ww, int hh,PictureBox destImg)
        {
          //  destImg.Size = new System.Drawing.Size(ww, hh);
            //顯示
            byte[] cutvalues = new byte[ww * hh * 3];
            int bytes = ww * hh * 3;
            Bitmap cutPic24 = new Bitmap(ww, hh, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            BitmapData _cutPic = cutPic24.LockBits(new Rectangle(0, 0, ww, 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;
                    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;
        }

简单使用gige千兆网口工业相机,国产崛起(二,c#)相关推荐

  1. 简单使用gige千兆网口basler工业相机

    1,安装basler相机的驱动程序,选择安装pylonc.net 2,创建c#程序,项目添加引用pylonc.net.dll动态库 3,最简单使用gige千兆网口basler工业相机 a,using ...

  2. MGS-H2系列1207万像素9.7帧1英寸全局曝光GIGE千兆网工业相机

    MGS-H2产品介绍 MGS-H2是度申工程师在第一代MGS-H产品系列在结构基础上进行全面优化的全新系列产品,大大降低了工艺组装的难度,进一步增强了产品的可兼容性.同时在软件功能上也进行了不同程度上 ...

  3. 多目千兆网工业相机同步采集(FPGA+DDR+千兆网+上位机)

    简介 公司新开发4目千兆网工业相机,4个sensor完全同步拍照,通过千兆网传输到电脑PC.满足某些需要使用多个相机但是空间窄小.无法使用多条网线.需要完全同步拍照等特殊需求.可用于航拍多摄像头,立体 ...

  4. 千兆网口 Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析

    原文  http://blog.csdn.net/gorilla0123/article/details/5972706 千兆网口 Freescale ETSEC + Marvell 88E1111 ...

  5. Y6000五口千兆网口5G工业路由器

    Y6000系列5G路由器 Y6000系列路由器是云联芯技有限公司基于无线网络需求,采用最新高性能硬件系统平台,使用OpenWRT(Linux)软件系统引用最新技术研发出来的一款全新的,性能更为优异的物 ...

  6. 海康工业相机MVS SDK使用云钥科技GigeVision千兆网工业相机

    介绍 因为海康工业相机完全支持GigeVision协议标准,海康工业相机的MVS SDK可以使用支持Gige Vision的工业相机.云钥科技的UGSMT系统千兆网络相机完全兼容GigeVision协 ...

  7. 88E1111与千兆网口连接

    88E1111是一款功能强大的网卡芯片,使用的也非常广泛,前段时间一块板子上用到这一块88E1111,硬件做好了之后,运行网络通信程序就是无法通信,因为是DSP连接88E1111到千兆网口,DSP端可 ...

  8. 16光8电全千兆宽温工业交换机16千兆光8千兆网口机架式网管型工业级以太网交换机

    8*1000M路以太网电口,16路千兆光接口,支持SNMP网管,18ms内自愈环网保护,工作温度:-40℃-85℃.相对湿度:95% ±3RH(无凝结).传输距离40km(其它数据接入共用,实现数据上 ...

  9. 4个万兆光口+8个千兆combo光电复用口+16个千兆网口管理型万兆机架式工业级以太网交换机

    1,数据控制:支持802.3X全双工流控,支持网络风暴抑制 2,冗余网络:支持STP/RSTP/MSTP,支持符合G.8032(ERPS)标准的以太环网保护技术(自愈时间<30ms),保障网络的 ...

最新文章

  1. three.js 加载显示文字
  2. 全文搜索引擎Elasticsearch,这篇文章给讲透了
  3. Day 8 Linux 优化-补充目录结构
  4. 006商城项目:该项目的路径访问问题
  5. Python学习笔记(四)Python函数
  6. 于金刚消息引擎服务器,基于MQTT的安全通信服务器的研究与实现
  7. 程序人生:给所有程序员的27个建议,抽空看看吧!
  8. java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)
  9. windows 反弹shell_容器内反弹shell的51种姿势
  10. mysql导入dat文件_MySql导入和抽取大数量级文件数据
  11. html5怎么在index设置背景,index.html · huangliusong/HTML5Canvas知乎登录页面动态线条背景动画代码 - Gitee.com...
  12. 利用alpha matte提取图片前景
  13. 蓝桥杯 ADV-224 算法提高 9-1九宫格
  14. linux下目标文件的类型6,Linux下文件类型
  15. Android学习2--项目文件列表简单分析
  16. EnableQ在线问卷调查引擎V3.0发布
  17. 【PFC】PFC测试指令
  18. 《淘宝技术这十年》之LAMP架构的网站
  19. linux 下安装redis并设置开机自启动
  20. php的tips(mysql语句union等问题)

热门文章

  1. MD5小白使用教程——一步到位!
  2. linux 发行版族谱
  3. 通俗易懂 理解散度和旋度
  4. Flink常见异常和错误信息小结
  5. 二维图形的剪裁_Sutherland-Hodgeman_Cohen—Sutherland
  6. 计算机图形学完整笔记(一):图形学概论
  7. VPS2104 小功率反激电源控制器 4-100VIN/120V/4A 功率管
  8. 读懂用好Timing Report
  9. 巴萨欧冠25人大名单
  10. 怎么样用ssh远程登录阿里云ecs服务器不成功解决方案