日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python读取海康威视摄像头价格_OpenCV+海康威视摄像头的实时读取

發(fā)布時(shí)間:2023/12/31 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python读取海康威视摄像头价格_OpenCV+海康威视摄像头的实时读取 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OpenCV+海康威視攝像頭的實(shí)時(shí)讀取

之前沒想過會有這么多朋友遇到問題,所以建了一個(gè)qq群536898072,專門供大家以后一起交流討論圖像和機(jī)器學(xué)習(xí)的project實(shí)踐問題。

環(huán)境

硬件:

PC:i7-4970 16GB內(nèi)存 攝像頭型號:DS-2CD3310D-I(2.8mm)

配置

保證使用SADP工具能夠識別攝像頭,然后配置IP與電腦在同一個(gè)網(wǎng)段。

再保證能夠從瀏覽器中訪問。賬號password默認(rèn)的通常是admin、a123456789(老版本號的攝像頭password是12345)。

登錄成功后可能要求下載WebComponent控件。下載好了安裝便是。假設(shè)仍然出現(xiàn)例如以下畫面:

則換一種瀏覽器試。

通常是默認(rèn)瀏覽器沒問題的。

配置使用sdk中自帶的ClientDemo.exe工具能夠訪問

配置sdk開發(fā)環(huán)境

– opencv的配置

這里不展開講opencv的配置,僅說明須要配置opencv環(huán)境變量、設(shè)置好相應(yīng)的vs開發(fā)環(huán)境的屬性配置

– 海康威視sdk屬性配置

由于是64位環(huán)境。為了增強(qiáng)屬性配置的內(nèi)聚性,單獨(dú)加入新項(xiàng)目屬性表,設(shè)置海康威視sdk的屬性

依賴庫寫全。為:

HCNetSDK.lib;PlayCtrl.lib;ws2_32.lib;winmm.lib;GdiPlus.lib;IPHlpApi.Lib;%(AdditionalDependencies)

代碼及說明

#include

#include

#include

#include

#include

#include

#include

#include

/*#include "PlayM4.h"*/

#include

#include

#include

#include "global.h"

#include "readCamera.h"

#define USECOLOR 1

using namespace cv;

using namespace std;

//--------------------------------------------

int iPicNum=0;//Set channel NO.

LONG nPort=-1;

HWND hWnd=NULL;

void yv12toYUV(char *outYuv, char *inYv12, int width, int height,int widthStep)

{

int col,row;

unsigned int Y,U,V;

int tmp;

int idx;

//printf("widthStep=%d.\n",widthStep);

for (row=0; row

{

idx=row * widthStep;

int rowptr=row*width;

for (col=0; col

{

//int colhalf=col>>1;

tmp = (row/2)*(width/2)+(col/2);

// if((row==1)&&( col>=1400 &&col<=1600))

// {

// printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp);

// printf("row*width+col=%d,width*height+width*height/4+tmp=%d,width*height+tmp=%d.\n",row*width+col,width*height+width*height/4+tmp,width*height+tmp);

// }

Y=(unsigned int) inYv12[row*width+col];

U=(unsigned int) inYv12[width*height+width*height/4+tmp];

V=(unsigned int) inYv12[width*height+tmp];

// if ((col==200))

// {

// printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp);

// printf("width*height+width*height/4+tmp=%d.\n",width*height+width*height/4+tmp);

// return ;

// }

if((idx+col*3+2)> (1200 * widthStep))

{

//printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2);

}

outYuv[idx+col*3] = Y;

outYuv[idx+col*3+1] = U;

outYuv[idx+col*3+2] = V;

}

}

//printf("col=%d,row=%d.\n",col,row);

}

//解碼回調(diào) 視頻為YUV數(shù)據(jù)(YV12),音頻為PCM數(shù)據(jù)

void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)

{

long lFrameType = pFrameInfo->nType;

if(lFrameType ==T_YV12)

{

#if USECOLOR

//int start = clock();

static IplImage* 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);

//int end = clock();

#else

static IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 1);

memcpy(pImg->imageData,pBuf,pFrameInfo->nWidth*pFrameInfo->nHeight);

#endif

//printf("%d\n",end-start);

Mat frametemp(pImg),frame;

//frametemp.copyTo(frame);

// cvShowImage("IPCamera",pImg);

// cvWaitKey(1);

EnterCriticalSection(&g_cs_frameList);

g_frameList.push_back(frametemp);

LeaveCriticalSection(&g_cs_frameList);

#if USECOLOR

// cvReleaseImage(&pImgYCrCb);

// cvReleaseImage(&pImg);

#else

/*cvReleaseImage(&pImg);*/

#endif

//此時(shí)是YV12格式的視頻數(shù)據(jù),保存在pBuf中,能夠fwrite(pBuf,nSize,1,Videofile);

//fwrite(pBuf,nSize,1,fp);

}

/***************

else if (lFrameType ==T_AUDIO16)

{

//此時(shí)是音頻數(shù)據(jù),數(shù)據(jù)保存在pBuf中。能夠fwrite(pBuf,nSize,1,Audiofile);

}

else

{

}

*******************/

}

///實(shí)時(shí)流回調(diào)

void CALLBACK fRealDataCallBack(LONG lRealHandle,DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize,void *pUser)

{

DWORD dRet;

switch (dwDataType)

{

case NET_DVR_SYSHEAD: //系統(tǒng)頭

if (!PlayM4_GetPort(&nPort)) //獲取播放庫未使用的通道號

{

break;

}

if(dwBufSize > 0)

{

if (!PlayM4_OpenStream(nPort,pBuffer,dwBufSize,1024*1024))

{

dRet=PlayM4_GetLastError(nPort);

break;

}

//設(shè)置解碼回調(diào)函數(shù) 僅僅解碼不顯示

if (!PlayM4_SetDecCallBack(nPort,DecCBFun))

{

dRet=PlayM4_GetLastError(nPort);

break;

}

//設(shè)置解碼回調(diào)函數(shù) 解碼且顯示

//if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL))

//{

// dRet=PlayM4_GetLastError(nPort);

// break;

//}

//打開視頻解碼

if (!PlayM4_Play(nPort,hWnd))

{

dRet=PlayM4_GetLastError(nPort);

break;

}

//打開音頻解碼, 須要碼流是復(fù)合流

// if (!PlayM4_PlaySound(nPort))

// {

// dRet=PlayM4_GetLastError(nPort);

// break;

// }

}

break;

case NET_DVR_STREAMDATA: //碼流數(shù)據(jù)

if (dwBufSize > 0 && nPort != -1)

{

BOOL inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);

while (!inData)

{

Sleep(10);

inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);

OutputDebugString(L"PlayM4_InputData failed \n");

}

}

break;

}

}

void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)

{

char tempbuf[256] = {0};

switch(dwType)

{

case EXCEPTION_RECONNECT: //預(yù)覽時(shí)重連

printf("----------reconnect--------%d\n", time(NULL));

break;

default:

break;

}

}

unsigned readCamera(void *param)

{

//---------------------------------------

// 初始化

NET_DVR_Init();

//設(shè)置連接時(shí)間與重連時(shí)間

NET_DVR_SetConnectTime(2000, 1);

NET_DVR_SetReconnect(10000, true);

//---------------------------------------

// 獲取控制臺窗體句柄

//HMODULE hKernel32 = GetModuleHandle((LPCWSTR)"kernel32");

//GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");

//---------------------------------------

// 注冊設(shè)備

LONG lUserID;

NET_DVR_DEVICEINFO_V30 struDeviceInfo;

lUserID = NET_DVR_Login_V30("192.168.2.64", 8000, "admin", "a123456789", &struDeviceInfo);

if (lUserID < 0)

{

printf("Login error, %d\n", NET_DVR_GetLastError());

NET_DVR_Cleanup();

return -1;

}

//---------------------------------------

//設(shè)置異常消息回調(diào)函數(shù)

NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);

//cvNamedWindow("IPCamera");

//---------------------------------------

//啟動預(yù)覽并設(shè)置回調(diào)數(shù)據(jù)流

NET_DVR_CLIENTINFO ClientInfo;

ClientInfo.lChannel = 1; //Channel number 設(shè)備通道號

ClientInfo.hPlayWnd = NULL; //窗體為空。設(shè)備SDK不解碼僅僅取流

ClientInfo.lLinkMode = 0; //Main Stream

ClientInfo.sMultiCastIP = NULL;

LONG lRealPlayHandle;

lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID,&ClientInfo,fRealDataCallBack,NULL,TRUE);

if (lRealPlayHandle<0)

{

printf("NET_DVR_RealPlay_V30 failed! Error number: %d\n",NET_DVR_GetLastError());

return 0;

}

//cvWaitKey(0);

Sleep(-1);

//fclose(fp);

//---------------------------------------

//關(guān)閉預(yù)覽

if(!NET_DVR_StopRealPlay(lRealPlayHandle))

{

printf("NET_DVR_StopRealPlay error! Error number: %d\n",NET_DVR_GetLastError());

return 0;

}

//注銷用戶

NET_DVR_Logout(lUserID);

NET_DVR_Cleanup();

return 0;

}

當(dāng)中終于得到的幀保存在g_frameList.push_back(frametemp);中。

前后設(shè)置了相應(yīng)的鎖,用來對該幀序列的讀寫進(jìn)行保護(hù)。這一部分內(nèi)容是要自己完畢的。即定義變量:

CRITICAL_SECTION g_cs_frameList;

std::list g_frameList;

主函數(shù)中的調(diào)用代碼,先建立線程,調(diào)用上述讀攝像頭的函數(shù)的回調(diào),并把讀到的幀序列保存在g_frameList中。然后再讀取該序列,保存到Mat里就可以:

int main()

{

HANDLE hThread;

unsigned threadID;

Mat frame1;

InitializeCriticalSection(&g_cs_frameList);

hThread = (HANDLE)_beginthreadex( NULL, 0, &readCamera, NULL, 0, &threadID );

...

EnterCriticalSection(&g_cs_frameList);

if(g_frameList.size())

{

list::iterator it;

it = g_frameList.end();

it--;

Mat dbgframe = (*(it));

//imshow("frame from camera",dbgframe);

//dbgframe.copyTo(frame1);

//dbgframe.release();

(*g_frameList.begin()).copyTo(frame[i]);

frame1 = dbgframe;

g_frameList.pop_front();

}

g_frameList.clear(); // 丟掉舊的幀

LeaveCriticalSection(&g_cs_frameList);

...

return 0;

}

總結(jié)

以上是生活随笔為你收集整理的python读取海康威视摄像头价格_OpenCV+海康威视摄像头的实时读取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。