intertNUC上qt+ros调用海康威视SDK登录以及预览画面
1.开发环境
电脑:inter的NUC8i5BEN
系统版本:Ubuntu16.04
ROS版本:kinetic
QT版本:5.9.0(QT+ros_qtc_plugin)
2.配置环境
使用的是海康威视在线测温热像仪,型号为DS-2TB21-3AVF,由于使用的NUC不支持该型号,用网线直连到NUC上不会显示,需要用以下处理
(1)需要一个网口转串口的接头,通过串口能够连接
(2)需要关闭防火墙
查看防火墙状态:sudo ufw status
关闭防火墙:sudo ufw disable
开启防火墙:sudo ufw enable
(3)配置网络
我使用的型号的热像仪ip是192.168.10.64,配置网络时将ip改为同网段的即可
3.调用海康威视SDK
(1)SDK下载
海康威视官网SDK下载:https://www.hikvision.com/cn/download_61.html
(2)配置环境
将上面的所有的.so库文件以及HCNetSDKCom中所有的.so库文件复制到/usr/lib/x86_64-linux-gnu文件夹下(试了各种引用外部库文件的方法就这种方法成功了,复制之前要给/usr/lib/x86_64-linux-gnu文件夹权限,执行sudo chmod 777 /usr/lib/x86_64-linux-gnu即可),然后再将sdk中incCn文件下的HCNetSDK.h拷贝到工程目录中存放头文件中文件夹下
(3)修改CMakeLists.txt
在target_link_libraries对应的库文件名即可,下面是我项目的CMakeLists.txt
##############################################################################
# CMake
##############################################################################
cmake_minimum_required(VERSION 2.8.0)
project(qt_ros_test)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)
##############################################################################
# Catkin
##############################################################################
# qt_build provides the qt cmake glue, roscpp the comms for a default talker
find_package(catkin REQUIRED COMPONENTS roscpp rviz std_msgs sensor_msgs)
find_package(Qt5 REQUIRED Core Widgets Multimedia)
set(QT_LIBRARIES Qt5::Widgets Qt5::Multimedia)
include_directories(${catkin_INCLUDE_DIRS})
# Use this to define what the package will export (e.g. libs, headers).
# Since the default here is to produce only a binary, we don't worry about
# exporting anything.
catkin_package()
##############################################################################
# Qt Environment
##############################################################################
# this comes from qt_build's qt-ros.cmake which is automatically
# included via the dependency call in package.xml
#rosbuild_prepare_qt4(QtCore QtGui) # Add the appropriate components to the component list here
##############################################################################
# Sections
##############################################################################
file(GLOB QT_FORMS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ui/*.ui)
file(GLOB QT_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} resources/*.qrc)
file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS include/qt_ros_test/*.hpp)
QT5_ADD_RESOURCES(QT_RESOURCES_CPP ${QT_RESOURCES})
QT5_WRAP_UI(QT_FORMS_HPP ${QT_FORMS})
QT5_WRAP_CPP(QT_MOC_HPP ${QT_MOC})
##############################################################################
# Sources
##############################################################################
file(GLOB_RECURSE QT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.cpp)
##############################################################################
# Binaries
##############################################################################
add_executable(qt_ros_test ${QT_SOURCES} ${QT_RESOURCES_CPP} ${QT_FORMS_HPP} ${QT_MOC_HPP})
target_link_libraries(qt_ros_test ${QT_LIBRARIES} ${catkin_LIBRARIES}
AudioRender
crypto
HCCore
hcnetsdk
hpr
NPQos
ssl
SuperRender
PlayCtrl
analyzedata
HCAlarm
HCCoreDevCfg
HCDisplay
HCGeneralCfgMgr
HCIndustry
HCPlayBack
HCPreview
HCVoiceTalk
iconv2
StreamTransClient)
install(TARGETS qt_ros_test RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
至此使用海康威视的sdk的环境就搭建完成,然后就可以使用SDK中的函数了
4.使用SDK登录并显示画面
我看的官方开发文档中的 设备网络SDK编程指南(DVR&NVR).pdf,文档中有实例和函数的解释说明
SDK中提供的源码
#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "HCNetSDK.h"
#include <time.h>
using namespace std;
typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
PROCGETCONSOLEWINDOW GetConsoleWindow;
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
char tempbuf[256] = {0};
switch(dwType)
{
case EXCEPTION_RECONNECT:
//预览时重连
printf("----------reconnect--------%d\n", time(NULL));
break;
default:
break;
}
}
void main() {
//---------------------------------------
//初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 获取控制台窗口句柄
HMODULE hKernel32 = GetModuleHandle("kernel32");
GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %d\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//设置异常消息回调函数
NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);
//---------------------------------------
//启动预览
LONG lRealPlayHandle;
HWND hWnd = GetConsoleWindow();
//获取窗口句柄
NET_DVR_PREVIEWINFO struPlayInfo = {0};
struPlayInfo.hPlayWnd = hWnd; //需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
struPlayInfo.lChannel //预览通道号
= 1;
struPlayInfo.dwStreamType = 0;
//0-主码流,1-子码流,2-码流 3,3-码流 4,以此类推
struPlayInfo.dwLinkMode = 0; //0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTP
struPlayInfo.bBlocked = 1; //0- 非阻塞取流,1- 阻塞取流
lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL);
if (lRealPlayHandle < 0)
{
printf("NET_DVR_RealPlay_V40 error\n");
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
Sleep(10000);
//---------------------------------------
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
//注销用户
NET_DVR_Logout(lUserID);
//释放 SDK 资源
NET_DVR_Cleanup();
return;
}
也可以参考这位博主的基于Qt的海康威视SDK二次开发-摄像头登陆、预览和抓图
最后运行显示如下
以上就是在intertNUC上qt+ros调用海康威视SDK登录以及预览画面的全部内容,有什么不对的地方欢迎指正。