文章目录
海康网络摄像头开发
1. sdk文件下载
-
下载对应的sdk(内含开发文档)
-
解压sdk压缩包
unzip CH-HCNetSDKV6.1.9.48_build20230410_linux64.zip
- 文件结构如下图
- 开发文档内容如下图
2. 测试c++ consoleDemo
- demo路径
CH-HCNetSDKV6.1.9.48_build20230410_linux64/Demo示例/1-C++开发示例/consoleDemo
2.1 CH-HCNetSDKV6.1.9.48_build20230410_linux64
目录位置位置
- 按照demo的readme.txt文档将
./库文件
里的.so库文件复制到./Demo示例/1-C++开发示例/consoleDemo/linux64/lib/
- 终端输入指令
cp -r ./库文件/* ./Demo示例/1-C++开发示例/consoleDemo/linux64/lib/
- 终端输入指令
2.2 修改src
源文件consoleMain.cpp
和CapPicture.cpp
中的设备信息
- 包括相机ip 登录名 密码(注:将ipv4设置为和相机同一网段,在浏览器输入相机ip,账号密码即可预览)
2.3 cd到Demo示例/1-C++开发示例/consoleDemo/linux64/proj
文件夹,终端输入make
- 即会在
Demo示例/1-C++开发示例/consoleDemo/linux64/lib
生成可执行文件sdkTest
- 在
Demo示例/1-C++开发示例/consoleDemo/linux64/lib
目录下打开终端输入./sdkTest
即可运行 - 会让选择执行的选项,选择4捕获图像即会在目录下保存一张名为
ssss.jpeg
的图片
3. 修改demo
3.1 将捕获一张图修改为循环存图
- 在存图代码
NET_DVR_CaptureJPEGPicture
外加一层循环 - 在可执行文件目录创建以当天日期命名的文件夹
- 将图放入日期名文件夹,并以
日期时分秒_id.jpeg
形式保存 consoleDemo/linux64/proj
目录重新运行make
指令/consoleDemo/linux64/lib
目录./sdkTest
运行程序,输入4即可循环保存图片(1秒约存10张图)
// 添加上这些头文件
#include <iostream>
#include <chrono>
#include <ctime>
#include <sstream>
#include <sys/stat.h>
// 在开头添加以下函数
// 判断文件夹是否存在
bool directoryExists(const std::string& dirName) {
struct stat st;
return (stat(dirName.c_str(), &st) == 0 && S_ISDIR(st.st_mode));
}
// 获取当前日期并返回字符串
std::string getCurrentDate()
{
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%Y%m%d", &tstruct);
return buf;
}
// 获取当前日期时间并返回字符串
std::string getCurrentTimeAsString()
{
auto now = std::chrono::system_clock::now();
std::time_t now_time = std::chrono::system_clock::to_time_t(now);
// 将 time_t 转换为 tm 结构体
struct tm *timeinfo = std::localtime(&now_time);
// 格式化输出时间
char buffer[80];
std::strftime(buffer, 80, "%Y%m%d%H%M%S", timeinfo);
return std::string(buffer);
}
// 将原本的NET_DVR_CaptureJPEGPicture修改为如下代码
int number=0;
while(true)
{
std::string folderName = getCurrentDate();
// 判断是否存在以当天日期命名的文件夹,如不存在则新建
if (!directoryExists(folderName)) {
if (mkdir(folderName.c_str(), 0777) == -1) {
std::cerr << "Error creating directory" << std::endl;
return 1;
}
}
std::string current_time=getCurrentTimeAsString();
// 需保存的文件名
std::string img_path="./"+folderName+"/"+current_time+"_"+std::to_string(number)+".jpeg";
// 为防止同时分秒的相片覆盖,名称加上id后缀
++number;
// .data()用于将std::string的img_path转为const char*
// 由于函数最后一个参数需要的是char*,再使用strdup将const char* 转换为char*
iRet = NET_DVR_CaptureJPEGPicture(lUserID, struDeviceInfoV40.struDeviceV30.byStartChan, &strPicPara,strdup(img_path.data()));
if (!iRet)
{
printf("pyd1---NET_DVR_CaptureJPEGPicture error, %d\n", NET_DVR_GetLastError());
return HPR_ERROR;
}
}
3.2 将Makefile修改为CMakeLists.txt
- 由于对Makefile不太熟悉,后续阅读或修改项目可能存在困难,使用
CMakeLists.txt
来控制后续程序的编译 Demo示例/1-C++开发示例/consoleDemo
目录输入touch CMakeLists.txt
新建文件CMakeLists.txt
书写内容如下- 用vscode打开
Demo示例/1-C++开发示例/consoleDemo
目录,安装cmake插件 - 在下方状态栏选择cmake为release,选择编译器版本,点击生成,成功后点击右边的小三角形即可运行
cmake_minimum_required(VERSION 3.0)
project(SDKTestProgram)
# 设置类似Makefile里的c++标志
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-strict-aliasing -Wno-unused-variable")
# message("CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR})
# 包含头文件路径
include_directories(${CMAKE_SOURCE_DIR}/include)
# 设置库目录
link_directories(${CMAKE_SOURCE_DIR}/linux64/lib)
file(GLOB_RECURSE SOURCES "${CMAKE_SOURCE_DIR}/src/*.cpp")
# foreach(source IN LISTS SOURCES)
# # NAME_WE 没有目录及后缀的文件名
# get_filename_component(source_name ${source} NAME_WE)
# list(APPEND SOURCE_NAMES ${source_name})
# endforeach()
# # 每一个单独的文件名
# message("SOURCE_NAMES: " ${SOURCE_NAMES})
message("SOURCES: " ${SOURCES})
add_executable(sdkTest ${SOURCES})
# 链接目标和库
target_link_libraries(sdkTest PRIVATE hcnetsdk)