本代码实现海康工业相机拍照并保存功能(MV_CC_SaveImageToFile)。
参考:MVS/MVS/Development/Documentations/海康工业相机SDK使用手册.chm
2020/2/19 Vivi
2020/3/05 Update
#
include
"MvCameraControl.h"
#
include
<stdio.h>
#
include
<Windows.h>
#
include
<conio.h>
#
include
<iostream>
using
namespace
std
;
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
}
;
nRet
=
MV_CC_EnumDevices
(
nTLayerType
,
&
m_stDevList
)
;
while
(
1
)
if
(
nTestFrameSize
>
19
)
break
;
for
(
int
nDeviceIndex
=
0
;
nDeviceIndex
<
m_stDevList
.
nDeviceNum
;
nDeviceIndex
++
)
nRet
=
-
1
;
void
*
m_handle
=
NULL
;
MV_CC_DEVICE_INFO m_stDevInfo
=
{
0
}
;
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
;
nRet
=
MV_CC_SetEnumValue
(
m_handle
,
"ExposureAuto"
,
2
)
;
if
(
MV_OK
!=
nRet
)
printf
(
"error: Exposure auto fail [%x]\n"
,
nRet
)
;
return
;
nRet
=
MV_CC_SetEnumValue
(
m_handle
,
"GainAuto"
,
2
)
;
if
(
MV_OK
!=
nRet
)
printf
(
"error: Gain auto fail [%x]\n"
,
nRet
)
;
return
;
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
;
stParam
.
iMethodValue
=
0
;
char
chImageName
[
256
]
=
{
0
}
;
unsigned
int
nFrameNum
=
stInfo
.
nFrameNum
;
if
(
nDeviceIndex
==
0
)
sprintf_s
(
chImageName
,
256
,
"image%02d_left.png"
,
nTestFrameSize
)
;
sprintf_s
(
chImageName
,
256
,
"image%02d_right.png"
,
nTestFrameSize
)
;
memcpy
(
stParam
.
pImagePath
,
chImageName
,
256
)
;
cout
<<
stParam
.
pImagePath
<<
"\n"
;
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
海康
工业相机
的出现,让普通的
海康
相机具备了更多的灵活性和可塑性。这样一种技术,无疑将会受到越来越多的开发者和用户的青睐,开启更多应用的可能性。