天天看點

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

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.cpp

    HKIPcamera.h

    HKIPcamera.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.cxx

    HKIPcamera.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