C++调取海康摄像头:
首先下载 海康摄像头 linux 版本的SDK: CH_HCNetSDK_V5.3.5.2_build20171124_Linux64.zip
解压后进入consoleDemo目录,这里是官方提供的Demo代码,可以实现多个测试功能:
printf("Input 1, Test GetStream\n");
printf(" 2, Test Configure params\n");
printf(" 3, Test Alarm\n");
printf(" 4, Test Capture Picture\n");
printf(" 5, Test play back\n");
printf(" 6, Test Voice\n");
printf(" 7, Test SDK ability\n");
printf(" 8, Test tool interface\n");
上面就是consoleMain.cpp主函数里统计的方法入口.
在用Makefile文件编译的时候,需要将CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/lib中的所有的文件复制到CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64/lib中
之后进入CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64/proj目录:
cd CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64/proj
目录中有一个Makefile文件,直接执行 make
命令就可以编译了.
编译成功后,进入目录: CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64
会生成一个可执行文件:sdkTest
直接执行./sdkTest
就启动了
按照提示输入1-8即可体验上面列出的功能.
例如输入:4
就会抓取摄像头的照片,并保存为ssss.jpeg
文件
通过改造,就可以将摄像头的照片一直保存到本地了,
顺便把consoleMain.cpp文件删掉,或把里面的main函数去掉,在CapPicture.cpp中添加main函数,这样直接编译后就进入CapPicture.cpp中的main函数了, 改造代码如下:
/*
* Copyright(C) 2010,Hikvision Digital Technology Co., Ltd
*
* File name��CapPicture.cpp
* Discription��
* Version ��1.0
* Author ��panyd
* Create Date��2010_3_25
* Modification History��
*/
#include "public.h"
#include "CapPicture.h"
#include
#include
/*******************************************************************
Function: Demo_Capture
Description: Capture picture.
Parameter: (IN) none
Return: 0--success��-1--fail.
**********************************************************************/
using namespace std;
int Demo_Capture()
{
NET_DVR_Init();
long lUserID;
//login
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("10.200.16.30", 8000, "admin", "admin1234", &struDeviceInfo);
if (lUserID < 0)
{
printf("pyd1---Login error, %d\n", NET_DVR_GetLastError());
return HPR_ERROR;
}
//
NET_DVR_JPEGPARA strPicPara = {0};
strPicPara.wPicQuality = 2;
strPicPara.wPicSize = 0;
int iRet;
iRet = NET_DVR_CaptureJPEGPicture(lUserID, struDeviceInfo.byStartChan, &strPicPara, "./ssss.jpeg");
if (!iRet)
{
printf("pyd1---NET_DVR_CaptureJPEGPicture error, %d\n", NET_DVR_GetLastError());
return HPR_ERROR;
}
LPNET_DVR_JPEGPARA JpegPara = new NET_DVR_JPEGPARA;
JpegPara->wPicQuality = 0;
JpegPara->wPicSize = 9;
char * Jpeg = new char[200*1024];
DWORD len = 200*1024;
LPDWORD Ret = 0;
if(!NET_DVR_SetCapturePictureMode(BMP_MODE))
{
printf("Set Capture Picture Mode error!");
printf("The error code is %d", NET_DVR_GetLastError());
}
printf("AAAAAAAAAA!");
//bool capture = NET_DVR_CaptureJPEGPicture(lUserID,1,JpegPara,"1111");
int i = 0;
time_t t_start, t_end;
while(1)
{
t_start = time(NULL);
// printf("begin[%d]:%ld",i,getCurrentTime());
bool capture = NET_DVR_CaptureJPEGPicture_NEW(lUserID,struDeviceInfo.byStartChan,JpegPara,Jpeg,len,Ret);
if(!capture)
{
printf("Error: NET_DVR_CaptureJPEGPicture_NEW = %d", NET_DVR_GetLastError());
return -1;
}
printf("BBBBBBBBBBBB!");
// for(int i=0;i<200*1024;i++)
// {
// printf("%d:%c",i,Jpeg[i]);
// }
FILE* fp;
char fname[50] = {};
sprintf(fname, "%s%d%s", "qqqq_", i++, ".jpg");
fp = fopen(fname,"wb+"); //wb+ 以读写方式打开或建立二进制文件
if(fp == NULL)
{
return false;//建立失败
}
fwrite(Jpeg,sizeof(char),200*1024,fp);//按字写入buffer,共size字节
fclose(fp);
t_end = time(NULL);
printf("time[%d]: %.0f s\n",i,difftime(t_end,t_start));
}
// vector data(200*1024);
// while(1)
// {
// bool capture = NET_DVR_CaptureJPEGPicture_NEW(lUserID,struDeviceInfo.byStartChan,JpegPara,Jpeg,len,Ret);
// if(!capture)
// {
// printf("Error: NET_DVR_CaptureJPEGPicture_NEW = %d", NET_DVR_GetLastError());
// return -1;
// }
// for(int i=0;i<200*1024;i++)
// data[i] = Jpeg[i];
// Mat img = imdecode(Mat(data),1);
// imshow("camera",img);
// waitKey(1);
// }
//logout
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
return HPR_OK;
}
int main()
{
Demo_Capture();
printf("ddddddd, Test Capture Picture\n");
}