2015-01-11 68 views
0

我可以使用OpenCV的大化SDK编辑视频从网络摄像机捕捉? 下面是大化样本代码的部分:OpenCV的编辑拍摄的IP摄像机

// initialized play list 
BOOL bOpenRet = PLAY_OpenStream(g_lRealPort, 0, 0, 1024 * 500); 
if (bOpenRet) 
{ 
    // start play 
    BOOL bPlayRet = PLAY_Play(g_lRealPort, hMainWnd); 
    if (bPlayRet) 
    { 
     // monitor preview 
     long lRealHandle = CLIENT_RealPlayEx(lLoginHandle, nChannelID, 0); 
     if (0 != lRealHandle) 
     { 
      // set recall function handling data 
      CLIENT_SetRealDataCallBackEx(lRealHandle, RealDataCallBackEx, (DWORD)0, 0x1f); 
     } 
     else 
     { 
      //printf("Fail to play!\n"); 
      PLAY_Stop(g_lRealPort); 
      PLAY_CloseStream(g_lRealPort); 
     } 
    } 
    else 
    { 
     PLAY_CloseStream(g_lRealPort); 
    } 
} 

上方连接使用TCP凸轮和所述流式视频中的代码,该回调函数RealDataCallBackEx被称为用于流,我可以显示在一个窗口中的视频,但我怎么让OpenCV库来处理它呢?

这里是RealDataCallBackEx函数的代码:

void __stdcall RealDataCallBackEx(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD  dwBufSize, LONG lParam, DWORD dwUser) 
    { 
    BOOL bInput = FALSE; 
    bInput = PLAY_InputData(g_lRealPort, pBuffer, dwBufSize); 
    } 
+0

我真的不知道是否要使用OpenCV来捕获和处理数据而不是Dahua SDK,或者只是想处理Dahua SDK已经捕获的数据。你能指定吗? – Amadeusz

+0

我未能捕捉到使用OpenCV,所以我安装了SDK。现在我可以使用SDK捕获并且我想使用OpenCV进行处理。 使用OpenCV进行捕获我需要IP地址,我使用iSpy实用程序来查找捕获IP地址,iSpy运行了大约2个小时并且什么都没发现(cam ip是192.168.1.108,端口是37777,用户/密码是admin/admin) – MMSabbagh

回答

0

如果IP摄像机采用一定的标准,你应该能够使用下面的OpenCV的代码获取的图像(适应需要的地方,我复制它从一个我自己的节目)。我想你也可以通过在浏览器中用正确的IP,端口和登录粘贴URL来测试。我将端口留在了88,因为通常情况下,您可以将这些命令发送到网络摄像机。

Mat returnFrame; 
string url = "http://"; 
url.append("192.168.1.108"); 
url.append(":88/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr="); 
url.append("admin"); 
url.append("&pwd="); 
url.append("admin"); 
VideoCapture cap(url); 
if (cap.isOpened()) { 
    Mat frame; 
    if (cap.read(frame) == false) { 
     cout << "Unable to grab frame" << endl; 
    } else returnFrame = frame.clone(); 
    cap.release(); 
} else cout << "Can't open URL" << endl; 
if (returnFrame.empty()) cout << "No frame to grab for cam!" << endl; 
else cout << "Cam Grabbed frame succesfully" << endl; 

如果你想打开一个字节的缓冲区为OpenCV的垫子,你可以使用下面的代码:

byte buf[] = new byte[100]; 
//fill buffer here 
Mat m = new Mat(1, 100, CvType.CV_8UC1); 
m.put(0, 0, buf); 

一定要定义的大小和类型正确。在这个例子中,它是1×100像素的1通道Mat。

+0

我找不到任何可能符合您提及的IP,我花了一个多星期的时间寻找我的CAM的IP!我下载了一个特别好的软件,用于查找名为“iSpy”的Ip,没有任何运气。 所以唯一的方法是使用tcp/udp套接字,它的工作原理和我可以使用我在我的问题中提到的代码在窗口上显示图像,但问题是如何使用相同的代码来提供OpenCV。 – MMSabbagh

+0

好的,我以为你想用OpenCV来捕捉它,但现在我明白你想把大华的图像变成OpenCV Mat吗?那么你可能想要寻找如何从RGB数据创建mat,就像在这个问题/答案中:http://stackoverflow.com/questions/22368312/creating-opencv-mat-from-user-data-results-in- image-with-circular-shifted-column –

+0

感谢您的帮助,让我说我想将数据流式传输到Mat!回调函数'RealDataCallBackEx'负责绘制框架(我把这个回调的主体添加到了上面的问题中),所以'BYTE * pBuffer'流是好像包含了框架,我怎样才能将它转换成OpenCV Mat ?? – MMSabbagh