onvif学习笔记6:onvif的OSD坐标小记

ONVIF的OSD服务为ONVIF客户端程序提供控制、配置设备(服务端)的OSD。与OSD有关的命令有:CreateOSD、DeleteOSD、GetOSDs、GetOSD、SetOSD、GetOSDOptions,本文不叙述这些接口的用法,仅对OSD坐标做一些个人笔记。

ONVIF标准文档中关于OSD坐标的描述如下:

从图中看到,onvif中的OSD坐标系是以图像中心点为原始坐标(0,0),坐标范围为-1~1。左上角为(-1,1),右上角为(1,1),左下角为(-1,-1),右下角为(1,-1)。使用ONVIF协议传输坐标时,就是使用-1~1之间的坐标范围,但到了设备(作为ONVIF服务端),需要对此相对坐标转换成为实际图像的坐标,在这里,图像坐标与计算机屏幕坐标一致,即左上角为(0, 0)。

下面伪代码是从ONVIF相对坐标转换为设备实际坐标:

void SetOSDPos(float x, float y)
{
    int pox = 0;
    int poy = 0;
    
    // 获取分辨率
    int width = 0;
    int height = 0;
    getsolution(&width, &height);

	// 转换为实际坐标 -> pox poy
    pox = (1.0 + x) * ((float)width) / 2.0;
    poy = (1.0 - y) * ((float)height) / 2.0;

    onvif_debug(6, "org pos: (%.2f, %.2f) --> (%d, %d)\n", x, y, pox, poy);
}

下面伪代码是从设备实际坐标转换为ONVIF相对坐标:

void GetOSDPos(float& x, float& y)
{
    // 获取当前OSD实际的坐标
    int pox = 0;
    int poy = 0;
    getpos(&pox, &poy);
    
    // 获取分辨率
    int width = 0;
    int height = 0;
    getsolution(&width, &height);

    // 转换为ONVIF的相对坐标 -> x y
    x = ((float)(pox - (int)res.width/2))/(float)(res.width/2);
    y = ((float)(poy - (int)res.height/2))/(float)(res.height/2);
    if (y != 0) y = -y; // 注:浮点数最好不要这样判断

    onvif_debug(6, "org pos: (%d, %d) --> (%.2f, %.2f)\n", pox, poy, x, y);
}

李迟 2016.4.6 周三夜
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值