本代码实现海康工业相机拍照并保存功能(MV_CC_SaveImageToFile)。
参考:MVS/MVS/Development/Documentations/海康工业相机SDK使用手册.chm

  • C接口定义
    • MV_CC_SaveImageToFile
2020/2/19 Vivi 2020/3/05 Update //#define _CRT_SECURE_NO_DEPRECATE # include "MvCameraControl.h" # include <stdio.h> # include <Windows.h> # include <conio.h> # include <iostream> using namespace std ; //#param warning(disable:4996) void main ( ) unsigned int nTestFrameSize = 0 ; int nRet = - 1 ; //枚举子网内指定的传输协议对应的所有设备 unsigned int nTLayerType = MV_GIGE_DEVICE | MV_USB_DEVICE ; MV_CC_DEVICE_INFO_LIST m_stDevList = { 0 } ; // 初始化 m_stDevList nRet = MV_CC_EnumDevices ( nTLayerType , & m_stDevList ) ; // m_stDevList 为相机设备数量 while ( 1 ) if ( nTestFrameSize > 19 ) break ; for ( int nDeviceIndex = 0 ; nDeviceIndex < m_stDevList . nDeviceNum ; nDeviceIndex ++ ) // 按第 0、1 个相机走流程 nRet = - 1 ; void * m_handle = NULL ; //选择查找到的在线设备,创建设备句柄 MV_CC_DEVICE_INFO m_stDevInfo = { 0 } ; // 初始化一台设备(m_stDevInfo) memcpy ( & m_stDevInfo , m_stDevList . pDeviceInfo [ nDeviceIndex ] , sizeof ( MV_CC_DEVICE_INFO ) ) ; // 复制设备地址 cout << "设备地址: " << m_stDevList . pDeviceInfo [ nDeviceIndex ] << endl ; nRet = MV_CC_CreateHandle ( & m_handle , & m_stDevInfo ) ; // 按顺序创建句柄 if ( MV_OK != nRet ) printf ( "error: CreateHandle fail [%x]\n" , nRet ) ; return ; //连接设备 nRet = MV_CC_OpenDevice ( m_handle ) ; if ( MV_OK != nRet ) printf ( "error: OpenDevice fail [%x]\n" , nRet ) ; return ; // 设置连续模式 unsigned int enMode = MV_TRIGGER_MODE_OFF ; //关闭触发源 nRet = MV_CC_SetEnumValue ( m_handle , "TriggerMode" , enMode ) ; if ( MV_OK != nRet ) printf ( "error: Trigger mode off fail [%x]\n" , nRet ) ; return ; /* 设置自动曝光 0 : Off 1 : Once 2 :Continuous */ nRet = MV_CC_SetEnumValue ( m_handle , "ExposureAuto" , 2 ) ; if ( MV_OK != nRet ) printf ( "error: Exposure auto fail [%x]\n" , nRet ) ; return ; /* 设置自动增益 0 : Off 1 : Once 2 :Continuous */ nRet = MV_CC_SetEnumValue ( m_handle , "GainAuto" , 2 ) ; if ( MV_OK != nRet ) printf ( "error: Gain auto fail [%x]\n" , nRet ) ; return ; /* 设置自动白平衡 0 : Off 2 : Once 1 :Continuous */ nRet = MV_CC_SetEnumValue ( m_handle , "BalanceWhiteAuto" , 1 ) ; if ( MV_OK != nRet ) printf ( "error: Balance white auto fail [%x]\n" , nRet ) ; return ; //...其他处理 //开始采集图像 nRet = MV_CC_StartGrabbing ( m_handle ) ; if ( MV_OK != nRet ) printf ( "error: StartGrabbing fail [%x]\n" , nRet ) ; return ; //获取一帧数据的大小 MVCC_INTVALUE stIntvalue = { 0 } ; nRet = MV_CC_GetIntValue ( m_handle , "PayloadSize" , & stIntvalue ) ; if ( nRet != MV_OK ) printf ( "failed in get PayloadSize [%x]\n" , nRet ) ; return ; int nBufSize = stIntvalue . nCurValue ; //一帧数据大小 unsigned char * pFrameBuf = NULL ; pFrameBuf = ( unsigned char * ) malloc ( nBufSize ) ; MV_FRAME_OUT_INFO_EX stInfo ; memset ( & stInfo , 0 , sizeof ( MV_FRAME_OUT_INFO_EX ) ) ; nRet = MV_CC_GetOneFrameTimeout ( m_handle , pFrameBuf , nBufSize , & stInfo , 1000 ) ; if ( MV_OK != nRet ) Sleep ( 10 ) ; //图片数据输入输出参数 MV_SAVE_IMG_TO_FILE_PARAM stParam ; stParam . enImageType = MV_Image_Png ; //需要保存的图像类型 stParam . enPixelType = stInfo . enPixelType ; //相机对应的像素格式 stParam . nWidth = stInfo . nWidth ; //相机图像宽 stParam . nHeight = stInfo . nHeight ; //相机图像高 stParam . nDataLen = stInfo . nFrameLen ; //原始图像数据长度 stParam . pData = pFrameBuf ; //原始图像数据 stParam . nQuality = 1 ; //jpg图像质量范围为(50-99], png图像质量范围为[0-9] stParam . iMethodValue = 0 ; // 将数据格式化输出到字符串 char chImageName [ 256 ] = { 0 } ; unsigned int nFrameNum = stInfo . nFrameNum ; //sprintf_s(chImageName, 256, "Image%d_w%d_h%d_fn%03d.png", nDeviceIndex, stParam.nWidth, stParam.nHeight, nFrameNum); if ( nDeviceIndex == 0 ) sprintf_s ( chImageName , 256 , "image%02d_left.png" , nTestFrameSize ) ; sprintf_s ( chImageName , 256 , "image%02d_right.png" , nTestFrameSize ) ; //void *memcpy(void *str1, const void *str2, size_t n) //从存储区 str2 复制 n 个字符到存储区 str1。 memcpy ( stParam . pImagePath , chImageName , 256 ) ; cout << stParam . pImagePath << "\n" ; //保存图像到文件,该接口支持BMP/JPEG/PNG/TIFF。 int nRet = MV_CC_SaveImageToFile ( m_handle , & stParam ) ; if ( MV_OK != nRet ) printf ( "Save photos failed! nRet [%x]\n" , nRet ) ; nTestFrameSize ++ ; free ( pFrameBuf ) ; //停止采集图像 nRet = MV_CC_StopGrabbing ( m_handle ) ; if ( MV_OK != nRet ) printf ( "error: StopGrabbing fail [%x]\n" , nRet ) ; return ; //关闭设备,释放资源 nRet = MV_CC_CloseDevice ( m_handle ) ; if ( MV_OK != nRet ) printf ( "error: CloseDevice fail [%x]\n" , nRet ) ; return ; //销毁句柄,释放资源 nRet = MV_CC_DestroyHandle ( m_handle ) ; if ( MV_OK != nRet ) printf ( "error: DestroyHandle fail [%x]\n" , nRet ) ; return ; //...其他处理 本代码实现海康工业相机拍照并保存功能(MV_CC_SaveImageToFile)。参考:MVS/MVS/Development/Documentations/海康工业相机SDK使用手册.chmC接口定义图像处理MV_CC_SaveImageToFile/*2020/2/19 Vivi2020/3/05 Update*///#define _CRT_SECURE_NO_DEPRECATE#include "MvCameraControl.h"#include &
C#版- 海康 工业相机 SDK实现隔时取帧方式 项目需要用到相机实时采集并每隔几帧处理一帧的功能,由于之前未接触过,一直不知道怎么实现,通过查阅各种资料,终于解决了相机隔时取帧并显示,特此记录下,做个笔记记录下。主要参考了@物随心转的这篇帖子,给了很大的引导作用,非常感谢! 相机SDK的采集帧的流程各个厂商大多一致,下面以 海康 相机通过回调方式取图为例: SDK提供注册回调函数的接口,用户可以将自己定义的回调函数注册在SDK内部,SDK获取到相机图像会主动回 调到应用程序供用户处理,此方式可以简化用户程序逻辑。 public partial class u cC amera : UserControl MyCamera. MV _ CC _ DEVICE _INFO_LIST m_p Device List; //设备列表 private MyCamera m_pMyCamera; //设备对象 // ch:用于从驱动获取图像的缓存 | e
相机到了,这也是我的第一次使用相机,然后呢在大符识别的程序完事后也是搁了很长的时间,然后工训的省赛也是比完了,反正这次比赛我深刻的认识到现场环境对视觉的影响真的是太大了,所以现在我也是得考虑现场的因素啥的,还有就是最近也是自己没有很上进,想得也是太多了,其实我更应该注重当下呀! 那来把啊,注重当下,开干! 我们使用的是 海康 工业相机 ,先了解一下什么是 工业相机 去! 首先我们在官网上下载客户端和sdk,然后我下载的是arrch64的,这个是网站:https://www.hikrobotics.com/ma
先说结论: 海康 相机在多相机实例时,不需要每个相机都注册回调函数,注册一次,通过回调函数的pUser指针可以获取到是哪个相机的回调。因此单相机或者不封装的朋友反而不会碰到这种错。 我做相机已经习惯性思维了,不管什么牌子相机都是实例化-注册回调-打开-设置UserSet1-开启码流-硬触发/软触发-关流-销毁实例。所以就按照basler的自己开了个类。没想到直接在回调报了个错,说是Invoke类型的已垃圾回收委托进行了回调,查百度都是牛头不对马嘴。 因为我已经实验过单相机回调没问题了,所以多相机就直接复制了
我司最近有款轮式巡检机器人用到了 海康 机器人的 工业相机 MV -CA060-10GC,我们的开发平台是树莓派(运行Ubuntu Server 1804),开发语言是Java,但该相机没有Java SDK,于是我决定自己开发一个。 好消息是 海康 机器人提供了C语言的SDK,这样我就能通过JNA直接调用,而不必写一行C 代码 。 问题的提出 开发过程中发现,有2个API在Windows下正常运行,在树莓派下却总是报错误的参数,错误码80000004 第一个API负责获取原始图像,第二个负责将原始图像压缩编码成jpg
Python是目前非常流行的一种编程语言,而 海康 威视则是一家致力于智能安防等领域的厂商。针对Python和 海康 相机的结合,也就是Python 海康 工业相机 ,这是一种可以将普通的 海康 威视摄像头转化为一种 工业相机 的技术。这样一来,借助于Python编程的优势,能够更加灵活地控制 海康 相机的拍摄功能以及图像处理过程,从而能够实现更多样化的应用。 在Python 海康 工业相机 的应用中,首先需要实现的就是 海康 相机的采集功能,通过Python编程启动相机拍摄图像或视频流,并对采集到的数据进行相应地处理。这种技术可以使得使用者根据自己的需求进行灵活的二次开发,实现更多的应用场景,例如机器视觉、工业自动化、智能交通等领域。 总之,Python 海康 工业相机 的出现,让普通的 海康 相机具备了更多的灵活性和可塑性。这样一种技术,无疑将会受到越来越多的开发者和用户的青睐,开启更多应用的可能性。