1. 程式人生 > >海康威視攝像機+opencv的視訊流讀取(實訓)

海康威視攝像機+opencv的視訊流讀取(實訓)

海康威視攝像機比較特殊的一點是,其解碼後輸出的影象格式為YV12,而不是普通的RGB格式等等的影象,這也給視訊流的讀取增加了一定難度,並且我們是基於opencv進行影象處理,這就要求我們在得到YV12影象後還需要將YV_12格式的視訊資料流轉碼為可供opencv處理的BGR型別的圖片資料,在進行了資料收集以及對海康威視提供的案例進行研究後,最後我們得到了可以實時調取海康威視攝像頭影象並且進行展示的方法。

程式主體在基本配置之外還分為三個部分,分別是標頭檔案,方法函式cpp與主函式cpp。其中方法函式包含了資料解碼回撥函式,實時視訊碼流資料獲取回撥函式,建構函式,解構函式,用作初始化狀態檢測的初始化函式,用作攝像頭id以及密碼輸入登入的登入函式,以及視訊流顯示函式。

具體實現如下:

標頭檔案:

#ifndef _HK_CAMERA_H_ 
#define _HK_CAMERA_H_

#include "HCNetSDK.h"
#include "plaympeg4.h"
#include "PlayM4.h"   //此標頭檔案需要按照下面第二步除錯Bug中的方法去新增
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>

using namespace cv;
using namespace std;

//int realframe_count;
//CRITICAL_SECTION g_csThreadCode1;

class HK_camera
{
public:
    HK_camera(void);
    ~HK_camera(void);

public:
    bool Init();                  //初始化
    bool Login(char* sDeviceAddress, char* sUserName, char* sPassword, WORD wPort);            //登陸
    //bool Login(const char* sDeviceAddress,const char* sUserName,const char* sPassword, WORD wPort);            //登陸(VS2017版本)
    void show();                  //顯示影象
	void process();//——————— 處理影象
	void close();


private:
    LONG lUserID;
};

#endif;

方法函式:

#include"HK_camera.h"
#include <iostream>

//全域性變數
LONG g_nPort;
Mat g_BGRImage;

//資料解碼回撥函式,
//功能:將YV_12格式的視訊資料流轉碼為可供opencv處理的BGR型別的圖片資料,並實時顯示。
void CALLBACK DecCBFun(long nPort, char* pBuf, long nSize, FRAME_INFO* pFrameInfo, long nUser, long nReserved2)
{
	if (pFrameInfo->nType == T_YV12)
	{
		std::cout << "the frame infomation is T_YV12" << std::endl;
		if (g_BGRImage.empty())
		{
			g_BGRImage.create(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3);
		}
		Mat YUVImage(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (unsigned char*)pBuf);

		cvtColor(YUVImage, g_BGRImage, COLOR_YUV2BGR_YV12);
		imshow("RGBImage1", g_BGRImage);
		waitKey(15);

		YUVImage.~Mat();
	}
}

//實時視訊碼流資料獲取 回撥函式
void CALLBACK g_RealDataCallBack_V30(LONG lPlayHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser)
{
	if (dwDataType == NET_DVR_STREAMDATA)//碼流資料
	{
		if (dwBufSize > 0 && g_nPort != -1)
		{
			if (!PlayM4_InputData(g_nPort, pBuffer, dwBufSize))
			{
				std::cout << "fail input data" << std::endl;
			}
			else
			{
				std::cout << "success input data" << std::endl;
			}

		}
	}
}
//建構函式
HK_camera::HK_camera(void)
{

}
//解構函式
HK_camera::~HK_camera(void)
{
}
//初始化函式,用作初始化狀態檢測
bool HK_camera::Init()
{
	if (NET_DVR_Init())
	{
		return true;
	}
	else
	{
		return false;
	}
}

//登入函式,用作攝像頭id以及密碼輸入登入
bool HK_camera::Login(char* sDeviceAddress, char* sUserName, char* sPassword, WORD wPort)
//bool HK_camera::Login(const char* sDeviceAddress,const char* sUserName,const char* sPassword, WORD wPort);        //登陸(VS2017版本)
{
	NET_DVR_USER_LOGIN_INFO pLoginInfo = { 0 };
	NET_DVR_DEVICEINFO_V40 lpDeviceInfo = { 0 };

	pLoginInfo.bUseAsynLogin = 0;     //同步登入方式
	strcpy_s(pLoginInfo.sDeviceAddress, sDeviceAddress);
	strcpy_s(pLoginInfo.sUserName, sUserName);
	strcpy_s(pLoginInfo.sPassword, sPassword);
	pLoginInfo.wPort = wPort;

	lUserID = NET_DVR_Login_V40(&pLoginInfo, &lpDeviceInfo);

	if (lUserID < 0)
	{
		return false;
	}
	else
	{
		return true;
	}
}

//視訊流顯示函式
void HK_camera::show()
{
	if (PlayM4_GetPort(&g_nPort))            //獲取播放庫通道號
	{
		if (PlayM4_SetStreamOpenMode(g_nPort, STREAME_REALTIME))      //設定流模式
		{
			if (PlayM4_OpenStream(g_nPort, NULL, 0, 1024 * 1024))         //開啟流
			{
				if (PlayM4_SetDecCallBackExMend(g_nPort, DecCBFun, NULL, 0, NULL))
				{
					if (PlayM4_Play(g_nPort, NULL))
					{
						std::cout << "success to set play mode" << std::endl;
					}
					else
					{
						std::cout << "fail to set play mode" << std::endl;
					}
				}
				else
				{
					std::cout << "fail to set dec callback " << std::endl;
				}
			}
			else
			{
				std::cout << "fail to open stream" << std::endl;
			}
		}
		else
		{
			std::cout << "fail to set stream open mode" << std::endl;
		}
	}
	else
	{
		std::cout << "fail to get port" << std::endl;
	}
	//啟動預覽並設定回撥資料流
	NET_DVR_PREVIEWINFO struPlayInfo = { 0 };
	struPlayInfo.hPlayWnd = NULL; //視窗為空,裝置SDK不解碼只取流
	struPlayInfo.lChannel = 1; //Channel number 裝置通道
	struPlayInfo.dwStreamType = 0;// 碼流型別,0-主碼流,1-子碼流,2-碼流3,3-碼流4, 4-碼流5,5-碼流6,7-碼流7,8-碼流8,9-碼流9,10-碼流10
	struPlayInfo.dwLinkMode = 0;// 0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-RTP/RTSP,5-RSTP/HTTP 
	struPlayInfo.bBlocked = 1; //0-非阻塞取流, 1-阻塞取流, 如果阻塞SDK內部connect失敗將會有5s的超時才能夠返回,不適合於輪詢取流操作.

	if (NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL))
	{
		namedWindow("RGBImage2");
	}
}

主函式:

#include"HK_camera.h"
#include <iostream>
#include <Windows.h>

using namespace std;

int main()
{
	HK_camera camera;
	camera.Init();
	cout << "init success" << endl;
	camera.Login("xxx.xx.xx.xxx", "yonghuming", "mimaxxxxxx", duankouhao);
	cout << "login successfully" << endl;
	camera.show();

	while (1)
	{

	}
	return 0;
}

最終結果如下:

攝像頭影象:


控制檯輸出:


但仍然存在諸如實時性不夠強等問題,下一步需要繼續解決。

相關推薦

攝像機+opencv視訊流讀取

海康威視攝像機比較特殊的一點是,其解碼後輸出的影象格式為YV12,而不是普通的RGB格式等等的影象,這也給視訊流的讀取增加了一定難度,並且我們是基於opencv進行影象處理,這就要求我們在得到YV12影象後還需要將YV_12格式的視訊資料流轉碼為可供opencv處理的BGR型

攝像機的實時讀取篇一OpenCV開發環境配置

參考博主lonelyrains的文章,利用海康SDK+OpenCV,實現了海康攝像機影象實時讀取。篇一介紹環境配置及相關注意事項。 OpenCV開發環境配置 1.下載opencv-2.4.11(其他版本配置過程相似),下載完成後,雙擊檔案會提示解壓到某個地方,解壓完成複製到要配置的目錄下

攝像機的實時讀取篇二SDK開發環境配置

參考博主lonelyrains的文章,利用海康SDK+OpenCV,實現了海康攝像機影象實時讀取。篇二介紹海康SDK開發環境配置及相關注意事項。 海康SDK開發環境配置 海康SDK開發環境配置具體步驟類似篇一(http://blog.csdn.net/u011674213/artic

攝像頭+OpenCV+VS2017 影象處理小結

本系列部落格記載博主用海康威視網路攝像頭以及OpenCV庫和VS2017開發環境搭建  視訊處理工程  的過程,主要是海康威視攝像頭與電腦的有線與無線連線,視訊流資料的獲取以及格式轉換,開發環境以及三方庫的的配置, 多執行緒處理轉碼後的影象幀的相關步驟,並且給出了一個簡單的實

攝像頭+OpenCV+VS2017 影象處理小結

第二篇 先介紹海康威視SDK的配置; 接著介紹並提取OpenCV庫的標頭檔案以及庫檔案供工程使用,期間還演示瞭如何配置屬性表; 最後將海康威視的SDK進行封裝,封裝成HK_camera類,並在主函式中生成並呼叫這個類的例項

校招面經筆試+一面+二面+三面+Offer

前言   海康的提前批挺早的,8月份就開始了,儘管海康本身口碑不怎麼好,但是海康研究院貌似還不錯,聽說提前批會大概率進海康研究院,所以網申了海康提前批,崗位是C++研發崗,結果秒拒了,效率還挺高,後來聽師兄講,海康研究院應該只要某些985,像我這種雙211渣碩,簡歷都過不了……   

web端開發經驗

  上篇部落格介紹了海康威視sdk以及web端的開發,成功預覽。還沒有成功的朋友可以去看一下上一篇文章   關於海康威視sdk與海康威視web的史上最精細的教程 (一) 但都是單個攝像頭,心裡總有個疑問,倆個攝像頭同時預覽該怎麼實現呢,經過和前端同時半天的探索,

錯誤程式碼說明(五)錯誤程式碼:63~81

海康威視錯誤程式碼說明 5 錯誤程式碼及說明 網路通訊庫錯誤碼 (63~81) 錯誤名稱 錯誤值 說明 NET_DVR_PICTURE_SIZ_ERROR

錯誤程式碼說明(四)錯誤程式碼:47~62

海康威視錯誤程式碼說明 4 錯誤程式碼及說明 網路通訊庫錯誤碼 (47~62) 錯誤名稱 錯誤值 說明 NET_DVR_USERNOTEXIST 47

錯誤程式碼說明(三)錯誤程式碼:31~46

海康威視錯誤程式碼說明 3 錯誤程式碼及說明 網路通訊庫錯誤碼 (31~46) 這裡有錯誤程式碼 31 、 32 、 33 、34 、 35 、 36 、37 、38 、 39 、40 、 41 、 42 、 43 、 44 、 45 、46

錯誤程式碼說明(二)錯誤程式碼:15~30

海康威視錯誤程式碼說明 2 錯誤程式碼及說明 網路通訊庫錯誤碼 (15~30) 這裡有錯誤程式碼 15 、 16 、 17 、18 、 19 、 20 、21 、22 、 23 、24 、 25 、 26 、 27 、 28 、 29 、30

錯誤程式碼說明(一)錯誤程式碼:1~14

海康威視錯誤程式碼說明 1 錯誤程式碼及說明 網路通訊庫錯誤碼 (1~14) 這裡有錯誤程式碼 1 、 2 、 3 、4 、 5 、 6 、7 、 8 、 9 、10 、 11 、 12 、 13 、 14 錯誤名稱

opencv讀取攝像頭

海康威視的網路攝像頭使用: 開發工具:vs2013 C++ 海康SDK 下載海康威視SDK:網址:http://www.hikvision.com/cn/download_61.html • 1:對照自己的開發平臺可以下載裝置網路SDK_Wi

qt+opencv開發網路攝像機採集處理程式

正在開發的專案用到海康威視網路攝像機,現在總結一下該攝像機使用過程中遇到的一些問題。 首先是海康威視網路攝像機的IP設定,使用官網上提供的“裝置網路搜尋”軟體將攝像機的IP地址前三位設定成與主機相同,同時把“使用DHCP”勾掉不使用。

OpenCV直接或通過NVR開啟IP攝像頭

1.直接開啟IP攝像頭 ①攝像頭接網線懟到電腦上,我用的是POE供電的攝像頭,單獨接電腦還要用個電源給它供電; ②下載Hikvision Tools,修改攝像頭IP地址(192.168.1.101)和密碼(asd123456),修改密碼用微信公眾號“海康威視客戶服務”掃碼; ③Video

網路攝像機 SDK二次開發JAVA1-開發環境搭建

硬體環境 相關的硬體環境準備:攝像機型號:DS-2CD2T25FD-I3,按照說明書搭建好硬體環境 SDK下載 開發工具:IDEA20173.3 , JDK: 9 官網SDK地址:http://www.hikvision.com/cn/download_61.html

網路攝像機連線、使用方法

親測有效,希望可以幫助大家。 1、網路相機型號:DS-2CD5047EFWD 2、下載SADP軟體: 首先,登陸海康威視官網www.hikvision.com  然後依次選擇服務與支援 → 下載 → Hikvision Tools(含SADP、錄影容量計算等工具) 

opencv呼叫攝像頭

 這裡使用的是海康威視的MV-CA020-20GC攝像頭,軟體使用的是VS2017與opencv3.1.1 (已經配置完成)。 調取攝像頭畫面需要先按照海康威視的說明書進行設定,設定完成後,安裝海康威視的客戶端MVS。 客戶端安裝完成後需要在VS中進行配置,具體配置方法C

關於網路攝像機二次開發問題

最近一個星期一直在研究海康威視的網路攝像機二次開發問題,糾結了很久。今天終於走通了一部分,記下來希望能夠幫助到更多人。現在是用的  VS2013 + opencv 進行測試。首先推薦兩篇對我幫助很大的博文:               http://blog.csdn.net

Ubuntu下使用Python-opencv獲取RTSP碼流教程

已更新(前面的方法雖然可行但不能解決根本問題,對不住大家了,讓大家浪費了時間!實際有更簡單的方案,請直接檢視分割線以下的內容) /* 下面這部分內容被作廢了 筆者在釋出這篇部落格之前為了拿到海康威視的碼流費了九牛二虎之力,當然也可能是筆者太菜,但是既然折騰出來