简单使用gige千兆网口工业相机,国产崛起(二,c#)
发现海康的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#)相关推荐
- 简单使用gige千兆网口basler工业相机
1,安装basler相机的驱动程序,选择安装pylonc.net 2,创建c#程序,项目添加引用pylonc.net.dll动态库 3,最简单使用gige千兆网口basler工业相机 a,using ...
- MGS-H2系列1207万像素9.7帧1英寸全局曝光GIGE千兆网工业相机
MGS-H2产品介绍 MGS-H2是度申工程师在第一代MGS-H产品系列在结构基础上进行全面优化的全新系列产品,大大降低了工艺组装的难度,进一步增强了产品的可兼容性.同时在软件功能上也进行了不同程度上 ...
- 多目千兆网工业相机同步采集(FPGA+DDR+千兆网+上位机)
简介 公司新开发4目千兆网工业相机,4个sensor完全同步拍照,通过千兆网传输到电脑PC.满足某些需要使用多个相机但是空间窄小.无法使用多条网线.需要完全同步拍照等特殊需求.可用于航拍多摄像头,立体 ...
- 千兆网口 Freescale ETSEC + Marvell 88E1111 uboot Linux 驱动分析
原文 http://blog.csdn.net/gorilla0123/article/details/5972706 千兆网口 Freescale ETSEC + Marvell 88E1111 ...
- Y6000五口千兆网口5G工业路由器
Y6000系列5G路由器 Y6000系列路由器是云联芯技有限公司基于无线网络需求,采用最新高性能硬件系统平台,使用OpenWRT(Linux)软件系统引用最新技术研发出来的一款全新的,性能更为优异的物 ...
- 海康工业相机MVS SDK使用云钥科技GigeVision千兆网工业相机
介绍 因为海康工业相机完全支持GigeVision协议标准,海康工业相机的MVS SDK可以使用支持Gige Vision的工业相机.云钥科技的UGSMT系统千兆网络相机完全兼容GigeVision协 ...
- 88E1111与千兆网口连接
88E1111是一款功能强大的网卡芯片,使用的也非常广泛,前段时间一块板子上用到这一块88E1111,硬件做好了之后,运行网络通信程序就是无法通信,因为是DSP连接88E1111到千兆网口,DSP端可 ...
- 16光8电全千兆宽温工业交换机16千兆光8千兆网口机架式网管型工业级以太网交换机
8*1000M路以太网电口,16路千兆光接口,支持SNMP网管,18ms内自愈环网保护,工作温度:-40℃-85℃.相对湿度:95% ±3RH(无凝结).传输距离40km(其它数据接入共用,实现数据上 ...
- 4个万兆光口+8个千兆combo光电复用口+16个千兆网口管理型万兆机架式工业级以太网交换机
1,数据控制:支持802.3X全双工流控,支持网络风暴抑制 2,冗余网络:支持STP/RSTP/MSTP,支持符合G.8032(ERPS)标准的以太环网保护技术(自愈时间<30ms),保障网络的 ...
最新文章
- three.js 加载显示文字
- 全文搜索引擎Elasticsearch,这篇文章给讲透了
- Day 8 Linux 优化-补充目录结构
- 006商城项目:该项目的路径访问问题
- Python学习笔记(四)Python函数
- 于金刚消息引擎服务器,基于MQTT的安全通信服务器的研究与实现
- 程序人生:给所有程序员的27个建议,抽空看看吧!
- java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)
- windows 反弹shell_容器内反弹shell的51种姿势
- mysql导入dat文件_MySql导入和抽取大数量级文件数据
- html5怎么在index设置背景,index.html · huangliusong/HTML5Canvas知乎登录页面动态线条背景动画代码 - Gitee.com...
- 利用alpha matte提取图片前景
- 蓝桥杯 ADV-224 算法提高 9-1九宫格
- linux下目标文件的类型6,Linux下文件类型
- Android学习2--项目文件列表简单分析
- EnableQ在线问卷调查引擎V3.0发布
- 【PFC】PFC测试指令
- 《淘宝技术这十年》之LAMP架构的网站
- linux 下安装redis并设置开机自启动
- php的tips(mysql语句union等问题)