如何将海康高清摄像机转成opencv连接海康威视可以处理的格式

谁做过海康网络摄像机SDK和OpenCV的接口,就是将回调视频码流变成一帧一帧的,然后用OpenCV处理,谢谢了_百度知道
谁做过海康网络摄像机SDK和OpenCV的接口,就是将回调视频码流变成一帧一帧的,然后用OpenCV处理,谢谢了
现在视频码流已经回调成功,就是如何转成OpenCV所处理的IplImage的问题,谢谢了
我有更好的答案
码流相当于数组, 只要创建一个IplImage类型的指针,然后将数组中的值赋值过去就可以了.
mark一下,同样遇到这样的问题。
cvCreateImageHeadercvsetdata试一下看看
为您推荐:
其他类似问题
皇家花园的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。想利用opencv写一个程序把摄像机矫正_百度知道
想利用opencv写一个程序把摄像机矫正
想利用opencv写一个程序把摄像机矫正,使得摄像头实时拍摄的图像能够实时纠正畸变,求大神给个思路,指导一下程序怎么写
我有更好的答案
用特征点匹配,求取图片仿射参数
求解释,比如用到什么函数?
opencv 有sift和surf特征点,速度比较慢,高版本的有orb速度更快些
什么样的畸变,说的具体一点?
应该就是普通畸变吧,我还没做过,想从简单开始
产生畸变的原因有很多?是摄像机的原因,还是人为抖动的原因?
是摄像机的原因
来自:求助得到的回答
为您推荐:
其他类似问题
您可能关注的内容
opencv的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。不积跬步,无以至千里;不积小流,无以成江海。
海康播放器sdk开发中的PlayM4_SetDecCallBack函数的调用
该函数如下:BOOL
PlayM4_SetDecCallBack(LONG nPort,void (CALLBACK* DecCBFun)(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo,
long nReserved1,long nReserved2))之前一直为怎么定义一个调用它烦恼,主要是不知道这个callback函数该怎么定义,后来在demon中看到了例子(如下),终于了解了。但是接下来问题又来了,编译总是提示error C2601:local function definitions are illegal确实很头痛啊,网上找都是说什么少了个“{"或者是"}“,怎么看怎么没少,后来才知道,这个callback函数要放在main函数外面,海康你太坑人了,也不提醒下啊。纠结几天啊。关于回调函数,请注意以下几点:1、回调函数必须有关键词 CALLBACK;2、回调函数本身必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数2 回调函数并不由开发者直接调用执行(只是使用系统接口API函数作为起点)3 回调函数通常作为参数传递给系统API,由该API来调用4 回调函数可能被系统API调用一次,也可能被循环调用多次// Function: The dec call back funtion.void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,
FRAME_INFO * pFrameInfo,
long nReserved1,long /*nReserved2*/){// OutputDebugString("解码回调");// DWORD dwTime = PlayM4_GetSpecialData(nPort);//// TRACE("nPort=%d, TYPE=%d; Width=%d; Height=%d\n", nPort, pFrameInfo-&nType, pFrameInfo-&nWidth, pFrameInfo-&nHeight);// TRACE("wptest==============Time: Year is %d, Month is %d, Day is %d, Hour is %d, %d, %d", GET_YEAR(dwTime),//
GET_MONTH(dwTime), GET_DAY(dwTime), GET_HOUR(dwTime), GET_MINUTE(dwTime), GET_SECOND(dwTime));/*
CPlayerDlg* pDlg = (CPlayerDlg *)nReserved1; if ( pFrameInfo-&nType == T_YV12 )
if(g_classAVI.IsWriteAVIHdr())
g_classAVI.SetFPS(pFrameInfo-&nFrameRate);
g_classAVI.WriteHeaders();
// ntsc qcif
if(pFrameInfo-&nHeight == 128)
if(pDlg-&m_pQcifTempBuf == NULL)
pDlg-&m_pQcifTempBuf = new BYTE[nSize];
int nPos = 0;
for(int i = 0; i & 4; i++)
CopyMemory(pDlg-&m_pQcifTempBuf + i * pFrameInfo-&nWidth, pBuf, pFrameInfo-&nWidth);
CopyMemory(pDlg-&m_pQcifTempBuf + 4 * pFrameInfo-&nWidth, pBuf, pFrameInfo-&nWidth * 120);
for(i = 0; i & 4; i++)
CopyMemory(pDlg-&m_pQcifTempBuf + (124 + i) * pFrameInfo-&nWidth, pBuf + pFrameInfo-&nWidth * 119, pFrameInfo-&nWidth);
nPos += nSize*2/3;
int w = pFrameInfo-&nWidth/2;
// U/V分量
for(int j = 0; j & 2; j++)
for(i = 0; i & 2; i++)
CopyMemory(pDlg-&m_pQcifTempBuf + i * w + nPos,
pBuf + nPos, w);
CopyMemory(pDlg-&m_pQcifTempBuf + w * 2 + nPos, pBuf + nPos, w * 60);
for(i = 0; i & 2; i++)
CopyMemory(pDlg-&m_pQcifTempBuf + w * (62 + i) + nPos, pBuf + w * 59 + nPos, w);
nPos += nSize*1/6;
g_classAVI.AddFileToAVI((char*)pDlg-&m_pQcifTempBuf, nSize);
g_classAVI.AddFileToAVI(pBuf, nSize);
if(g_classAVI.IsExceedMaxFileLen())
SendMessage(AfxGetApp()-&GetMainWnd()-&m_hWnd,WM_FILE_END,m_lPort,0);
}*/// Sleep(1);}
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!环境:Red Hat Enterprise linux As5 SDK版本: CH-HCNetSDK(Linux)4.0.2.7
OpenCv:2.2.0 将控制台演示代码的 GetStream.cpp 覆盖为以下,就能转换成 IplImage 内存数据,IplImage *img 是YUV格式,IplImage *imgBgr 是BGR格式:
* Copyright(C) 2010,Hikvision Digital Technology Co., Ltd
name:GetStream.cpp
* Discription:
* Create Date:
* Modification History:
#ifdef _WIN32
#include &windows.h&
#elif defined(__linux__)
&unistd.h&
#include "HCNetSDK.h"
#include "public.h"
#include &stdio.h&
#include &time.h&
#include "playsdkpu.h"
#include &cv.h&
#include &cxcore.h&
#include &highgui.h&
void yv12toYUV(char *outYuv, char *inYv12, int width, int height,int widthStep)
unsigned int Y,U,V;
unsigned int red,blue,
printf("widthStep=%d.\n",widthStep);
for (row=0; row& row++)
idx=row * widthS
int rowptr=row*
for (col=0; col& 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);
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]
outYuv[idx+col*3+1] = U;
outYuv[idx+col*3+2] = V;
printf("col=%d,row=%d.\n",col,row);
void CALLBACK g_DecCBFun(int nPort,char * pBuf,int nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)
printf("call g_DecCBFun suceess.\n");
printf("nPort=%d,nSize=%d,pFrameInfo.nWidth=%ld,pFrameInfo.nHeight=%ld,\
pFrameInfo.nStamp=%ld,pFrameInfo.nType=%ld,pFrameInfo.nFrameRate=%ld.\n",
nPort,nSize,pFrameInfo-&nWidth,pFrameInfo-&nHeight,
pFrameInfo-&nStamp,pFrameInfo-&nType,pFrameInfo-&nFrameRate);
switch (pFrameInfo-&nType)
case T_AUDIO16: //音频数据
printf("pFrameInfo.nType is T_AUDIO16.\n");
case T_RGB32: //系统头
printf("pFrameInfo.nType is T_RGB32.\n");
case T_UYVY: //系统头
printf("pFrameInfo.nType is T_UYVY.\n");
case T_YV12: //系统头
printf("pFrameInfo.nType is T_YV12.\n");
printf("Error pFrameInfo.nType.\n");
IplImage *img = cvCreateImage(cvSize(), IPL_DEPTH_8U, 3);
printf("img-&imageSize=%d.\n",img-&imageSize);
printf("cvCreateImage sucess.\n");
scal = cvGet2D(img,);//获取像素点
double valY = scal.val[0];
double valU = scal.val[1];
double valV = scal.val[2];
printf("valY=%e, valU=%e,valV=%e.\n",valY,valU,valV);
yv12toYUV(img-&imageData, pBuf, ,img-&widthStep);
printf("yv12toYUV sucess.\n");
scal = cvGet2D(img,);//获取像素点
valY = scal.val[0];
valU = scal.val[1];
valV = scal.val[2];
printf("valY=%e, valU=%e,valV=%e.\n",valY,valU,valV);
IplImage *imgBgr = cvCreateImage(cvSize(), IPL_DEPTH_8U, 3);
printf("imgBgr-&imageSize=%d.\n",imgBgr-&imageSize);
cvCvtColor(img, imgBgr, CV_YCrCb2BGR);
scal = cvGet2D(imgBgr,);//获取像素点
valY = scal.val[0];
valU = scal.val[1];
valV = scal.val[2];
printf("B=%e, G=%e,R=%e.\n",valY,valU,valV);
printf("cvCvtColor sucess.\n");
cvSaveImage("cap.bmp",imgBgr);
cvSaveImage("./cap.jpg",imgBgr,0);
/*printf("cvSaveImage sucess.\n");
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser)
printf("pyd---(hik_v30)Get data,the size is %d.\n",
dwBufSize);
unsigned char pBitmap[50000];
unsigned int pBmpS
hwnd.uWidth=0;
hwnd.uHeight=0;
switch (dwDataType)
case NET_DVR_SYSHEAD: //系统头
if (!PlayM4_GetPort(&lPort))
//获取播放库未使用的通道号
printf("(hik_v30)Get PlayM4_GetPort Error.\n");
printf("(hik_v30)Get PlayM4_GetPort lPort=%d.\n",lPort);
//m_iPort = lP //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放
if (dwBufSize & 0)
if (!PlayM4_OpenStream(lPort, (char*)pBuffer, dwBufSize, )) //打开流接口
printf("(hik_v30)Get PlayM4_OpenStream Error.\n");
printf("(hik_v30)Get PlayM4_OpenStream Success.\n");
if(!PlayM4_SetDecCallBack(lPort,g_DecCBFun))
printf("(hik_v30)Get PlayM4_SetDecCallBack Error.\n");
printf("(hik_v30)Get PlayM4_SetDecCallBack Success.\n");
if (!PlayM4_Play(lPort, hwnd)) //播放开始
printf("(hik_v30)Get PlayM4_Play Error.\n");
printf("(hik_v30)Get PlayM4_Play Success.\n");
case NET_DVR_STREAMDATA:
//码流数据
if(PlayM4_GetBMP(lPort,pBitmap,,&pBmpSize))
printf("(hik_v30)Get PlayM4_GetBMP Bmp Size = %d.\n",
pBmpSize);
printf("(hik_v30)Get PlayM4_GetBMP Error =%d.",PlayM4_GetLastErrorCode());
if (dwBufSize & 0 && lPort != -1)
if (!PlayM4_InputData(lPort, (char*)pBuffer, dwBufSize))
printf("(hik_v30)Get PlayM4_InputData Error.\n");
printf("(hik_v30)Get PlayM4_InputData success.\n");
void CALLBACK g_HikDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser)
printf("pyd---(hik)Get data,the size is %d.\n", dwBufSize);
void CALLBACK g_StdDataCallBack(int lRealHandle, unsigned int dwDataType, unsigned char *pBuffer, unsigned int dwBufSize, unsigned int dwUser)
printf("pyd---(rtsp)Get data,the size is %d.\n", dwBufSize);
/*******************************************************************
Demo_GetStream
Description:
preview(no "_V30")
Parameter:
0--successful,-1--fail。
**********************************************************************/
int Demo_GetStream()
NET_DVR_Init();
long lUserID;
NET_DVR_DEVICEINFO struDeviceI
lUserID = NET_DVR_Login("172.2.87.106", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID & 0)
printf("pyd1---Login error, %d\n", NET_DVR_GetLastError());
return HPR_ERROR;
//Set callback function of getting stream.
long lRealPlayH
NET_DVR_CLIENTINFO ClientInfo = {0};
#if (defined(_WIN32) || defined(_WIN_WCE))
ClientInfo.hPlayWnd
#elif defined(__linux__)
ClientInfo.hPlayWnd.x = 0;
ClientInfo.hPlayWnd.y = 0;
ClientInfo.hPlayWnd.uHeight = 0;
ClientInfo.hPlayWnd.uWidth = 0;
ClientInfo.lChannel
//channel NO
//ClientInfo.lLinkMode
= 0x; //Record when breaking network.
ClientInfo.lLinkMode
ClientInfo.sMultiCastIP = NULL;
lRealPlayHandle = NET_DVR_RealPlay(lUserID, &ClientInfo);
if (lRealPlayHandle & 0)
printf("pyd1---NET_DVR_RealPlay_V30 error\n");
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return HPR_ERROR;
//Set callback function of getting stream.
iRet = NET_DVR_SetRealDataCallBack(lRealPlayHandle, g_HikDataCallBack, 0);
if (!iRet)
printf("pyd1---NET_DVR_RealPlay_V30 error\n");
NET_DVR_StopRealPlay(lRealPlayHandle);
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return HPR_ERROR;
#ifdef _WIN32
Sleep(5000);
//millisecond
defined(__linux__)
sleep(500);
NET_DVR_StopRealPlay(lRealPlayHandle);
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return HPR_OK;
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
char tempbuf[256] = {0};
switch(dwType)
case EXCEPTION_RECONNECT:
//预览时重连
printf("pyd----------reconnect--------%d\n", time(NULL));
/*******************************************************************
Demo_GetStream_V30
Description:
preview(_V30)
Parameter:
0--successful,-1--fail。
**********************************************************************/
int Demo_GetStream_V30()
NET_DVR_Init();
//设置连接时间,与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
long lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceI
//lUserID = NET_DVR_Login_V30("172.2.87.106", 8000, "admin", "12345", &struDeviceInfo);
//lUserID = NET_DVR_Login_V30("113.18.11.162", 8000, "admin", "12345", &struDeviceInfo);
lUserID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID & 0)
printf("pyd1---Login error, %d\n", NET_DVR_GetLastError());
return HPR_ERROR;
NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);
//Set callback function of getting stream.
long lRealPlayH
NET_DVR_CLIENTINFO ClientInfo = {0};
#if (defined(_WIN32) || defined(_WIN_WCE))
ClientInfo.hPlayWnd
#elif defined(__linux__)
ClientInfo.hPlayWnd.x = 0;
ClientInfo.hPlayWnd.y = 0;
ClientInfo.hPlayWnd.uHeight = 0;
ClientInfo.hPlayWnd.uWidth = 0;
ClientInfo.lChannel
//channel NO.
//ClientInfo.lLinkMode
= 0x; //Record when breaking network.
ClientInfo.lLinkMode
ClientInfo.sMultiCastIP = NULL;
lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, g_RealDataCallBack_V30, NULL, 0);
//lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0);
if (lRealPlayHandle & 0)
printf("pyd1---NET_DVR_RealPlay_V30 error\n");
return HPR_ERROR;
//Set rtsp callback function of getting stream.
//NET_DVR_SetStandardDataCallBack(lRealPlayHandle, g_StdDataCallBack, 0);
#ifdef _WIN32
Sleep(3000);
//millisecond
defined(__linux__)
sleep(100);
NET_DVR_StopRealPlay(lRealPlayHandle);
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
return HPR_OK;
&&&& 这段代码在保存成jpg图片时,会内存溢出。原因是opencv保存jpg文件时要使用libjpeg.so 库的jpeg_start_compress 等函数, 但libm4paly.so也有jpeg_start_compress等函数。程序会找到libm4paly.so中的函数,导致异常。 我的libjpeg.so 库 在/usr/lib下。通过-Wl,-rpath, 选项让程序先找libjpeg.so
g++ -g -lopencv_core -lopencv_highgui -ljpeg -lhcnetsdk -lm4play -o hctest *.cpp -L/usr/local/lib -Wl,-rpath,/usr/lib,-rpath,./
编译后运行,就不会运行异常了。
相关标签/搜索豆丁微信公众号
君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
OpenCV中标定函数的源码详解和改进
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
OpenCV中标定函数的源码详解和改进
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 opencv 海康威视 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信