海康SDK配置以及 windows/linux下python接口的封装(swig)

1.4_海康SDK

文章目录

  • 1.4_海康SDK
      • 0、海康摄像头SDK配置
      • 1、得到海康对应参数
      • 2. rtsp协议
      • 3、mac下Python调用海康SDK实时显示网络摄像头(swig)
        • Error: 'Python.h' file not found
        • Error: 'boost/preprocessor/repetition/repeat_from_to.hpp' file not found
        • Error: linux和mac的库不通用(我可能是个傻子,所以mac上根本不能实现……)
      • 4、windows下Python调用海康SDK实时显示网络摄像头(swig)
        • Error:IplImage* 不能转化为 Mat

0、海康摄像头SDK配置

1、捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(二)
http://blog.csdn.net/wanghuiqi2008/article/details/31410509

2、opencv读取海康威视摄像头(可用)ipcamera
http://blog.csdn.net/shakevincent/article/details/51490197

3、SDK库文件和头文件配置

  • 解压SDK可以得到头文件和库文件

  • 在VC++目录中添加opencv的头文件包含路径和SDK中的头文件(修改“头文件”为“include”)

  • 添加库文件:既要添加库文件lib也要把lib下的HCNetSDKCom文件包含进去

  • 再链接器——输入——添加依赖项,把opencv的lib和SDK中的lib添加进去(包含HCNetSDKCom的lib)

  • Q1: HCNetSDK.h 中有个地方要加个空格

  • 修改plaympeg4.h文件。在extern "C" __declspec(dllexport)"C"__之间需要增加空格,否则会导致编译报错。

  • Q2: HCNetSDK/lib 包括 HCNetSDKCom 中的dll 复制到windows/system32

4、调用dll:
.h, .lib, .dll 的路径分别放在包含目录,库目录(以及链接器-输入),windows/system32
VS 2015 DLL的创建、静态调用和动态调用
VS 2013环境生成和调用DLL动态链接库

1、得到海康对应参数

DWORD getFocusPos(NET_DVR_PREVIEWINFO struInfo) {
	NET_DVR_FOCUSMODE_CFG *focusModeCfg = new NET_DVR_FOCUSMODE_CFG();//初始化PTZ基本参数结构体
	LPVOID *ptr = new LPVOID();//接收数据的缓冲指针 
	//LPVOID ptr;
	DWORD size = sizeof(focusModeCfg);//获取结构体空间大小
	LPDWORD BytesReturned;// 实际收到的数据长度指针,不能为NULL 
	NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_FOCUSMODECFG, struInfo.lChannel, ptr, size, BytesReturned);//获取配置参数指针	
	focusModeCfg = (NET_DVR_FOCUSMODE_CFG *)ptr;
	std::cout << "dwFocusPos:" << focusModeCfg->dwFocusPos  << std::endl;
	return focusModeCfg->dwFocusPos;
}

LPVOID *ptr = new LPVOID(); 在堆上存储数据,适用于大容量的数据
LPVOID ptr; 在内存中开辟空间

2. rtsp协议

存在一个很大的缺陷,即通过流媒体协议获得的码流没有办法满足实时要求,返回图像存在 3-5 秒延时,在实际项目中并不可行。另一方面,仅仅取得码流对于实际项目也并不足够,还需要想方设法对云台进行控制。
// 说明:
// username:用户名,例如admin
// passwd:密码,例如12345
// ip:设备的ip地址,例如192.0.0.64
// port:端口号默认554,若为默认可以不写
// codec:有h264、MPEG-4、mpeg4这几种
// channel:通道号,起始为1
// subtype:码流类型,主码流为main,子码流为sub

rtsp://[username]:[passwd]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
cam = cv2.VideoCapture(“rtsp://admin:[email protected]:554/h264/ch1/sub/av_stream”)

3、mac下Python调用海康SDK实时显示网络摄像头(swig)

linux下Python调用海康SDK实时显示网络摄像头

Error: ‘Python.h’ file not found

  • 解决方法:
    https://developer.apple.com/library/archive/technotes/tn2328/_index.html
    点击项目-targets-build settings
python3.7-config --cflags
# 输出结果:将-I后的路径添加到 Header Search Paths setting
-I/Users/wumanjia/anaconda3/include/python3.7m -I/Users/wumanjia/anaconda3/include/python3.7m -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/wumanjia/anaconda3/include -arch x86_64 -I/Users/wumanjia/anaconda3/include -arch x86_64

python3.7-config --ldflags
# 输出结果:将-L后的路径打开,拖动文件libpython3.7.dylib至项目中
-L/Users/wumanjia/anaconda3/lib/python3.7/config-3.7m-darwin -lpython3.7m -ldl -framework CoreFoundation -Wl,-stack_size,1000000 -framework CoreFoundation

Error: ‘boost/preprocessor/repetition/repeat_from_to.hpp’ file not found

  • 解决方法:安装boost brew install boost
    macOS 中Boost的安装和使用
    macOS 中Boost的安装和使用
    Mac OS下安装Boost库并在Xcode下测试运行
    (1)头文件目录:/usr/local/Cellar/boost/1.69.0/include
    Add /usr/local/boost_1_60_0/include/ to the Header Search Paths
    (2)lib目录:/usr/local/Cellar/boost/1.69.0/lib
    Add /usr/local/boost_1_60_0/lib/ to the Library Search Paths

Error: linux和mac的库不通用(我可能是个傻子,所以mac上根本不能实现……)

linux下编译的库可以拿到mac下来用吗

4、windows下Python调用海康SDK实时显示网络摄像头(swig)

HikVision SDK: C++ 至 Python

  1. 安装swig。并添加相应环境变量

  2. 下载opencv-swig。

  3. 将上述接口文件中 lib文件夹的所有文件拷贝到项目所在目录,并与三个源文件放置在一起。(注:源文件包括HKIPcamera.cppHKIPcamera.hHKIPcamera.i

  4. 通过命令行使用 swig 生成HKIPcamera_wrap.cxx文件。cd到HKIPcamera.i源文件文件夹下,并修改 OpenCV 路径

swig -I"D:\Program Files\opencv3\opencv\build\include" -python -c++ HKIPCamera.i
  1. 下载 boost 库。boost 库提供了一系列扩展的 C++ 方法,并将其头文件和库文件添加到项目中。
// 头文件目录
D:\Boost\boost_1_68_0
// 库文件目录
D:\Boost\boost_1_68_0\libs
  1. 编译动态链接库.dll。需要另外创建一个新的「Win32 Console Application」工程,且反选「生命周期(SDL)检查」,否则会导致编译失败。
  • 在「属性管理器」添加 Python 头文件目录和库目录。再将HKIPcamera.h文件添加到头文件、HKIPcamera_wrap.cxxHKIPcamera.cpp添加到源文件、HKIPcamera.i 添加到工程目录下,进行编译。
  • 将生成的.dll文件改名为_HKIPcamera.pyd,并与HKIPcamera.py放置在同一文件目录下,即可在Python中引用。

Error:IplImage* 不能转化为 Mat

Mat pImg(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3);
Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, pBuf);
cv::cvtColor(src, pImg, CV_YUV2BGR_YV12);
//static Mat* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);//得到图像的Y分量  
//yv12toYUV(pImgYCrCb->imageData, pBuf, pFrameInfo->nWidth, pFrameInfo->nHeight, pImgYCrCb->widthStep);//得到全部RGB图像
//static IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);
//cvCvtColor(pImgYCrCb, pImg, CV_YCrCb2RGB);
  1. 测试 test.py
    linux下Python调用海康SDK实时显示网络摄像头

  2. 生成的dll其实可以通用
    Error: 在另外电脑上运行,报错dll load faild

  • 解决:将相关dll放在当前文件夹中(包括opencv+HIKdll)可以通过dependecy walker查看
  • 使用:必须使用python3.6

你可能感兴趣的:(海康SDK配置以及 windows/linux下python接口的封装(swig))