首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV编辑捕获的ip摄像机

OpenCV编辑捕获的ip摄像机
EN

Stack Overflow用户
提问于 2015-01-11 21:56:07
回答 2查看 2.4K关注 0票数 0

我可以使用OpenCVDahua 编辑从Ip相机中拍摄的视频吗?以下是大华示例代码的部分:

代码语言:javascript
复制
// 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函数的代码:

代码语言:javascript
复制
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);
    }
EN

回答 2

Stack Overflow用户

发布于 2015-01-12 08:30:40

如果IP摄像机使用某些标准,您应该能够使用以下OpenCV代码获取图像(在需要的地方,我从自己的程序中复制了它)。我认为您也可以通过在浏览器中粘贴带有正确的ip、端口和登录名的url来测试这一点。我离开端口在88,因为这通常是您可以发送这些命令的ip相机。

代码语言:javascript
复制
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 Mat,可以使用以下代码:

代码语言:javascript
复制
byte buf[] = new byte[100];
//fill buffer here
Mat m = new Mat(1, 100, CvType.CV_8UC1);
m.put(0, 0, buf);

确保正确定义大小和类型。在本例中,它是一个1x100像素的1通道Mat。

票数 0
EN

Stack Overflow用户

发布于 2019-08-08 13:15:48

我只成功地使用了函数CLIENT_SnapPictureEx

代码语言:javascript
复制
CLIENT_SetSnapRevCallBack(OnSnapRevMessage, dwUser);
NET_SNAP_PARAMS _netSnapParam;
_netSnapParam.Channel = (uint)ChannelNum;
_netSnapParam.mode = 1;
CLIENT_SnapPictureEx(lLoginID, _netSnapParam, reserved);


private void SnapRevCallBack(IntPtr lLoginID, IntPtr pBuf, uint RevLen, uint EncodeType, uint CmdSerial, IntPtr dwUser)
    {
        byte[] data = new byte[RevLen];
        Marshal.Copy(pBuf, data, 0, (int)RevLen);
        img = Cv2.ImDecode(data, ImreadModes.Color);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27892548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档