Opencv画出斜矩形
描述
opencv可以利用rect,绘制出与图像坐标系u轴v轴平行的,姿态正的矩形
如果该矩形绕其原点旋转,如何画出呢?
思路
利用原矩形的四个点,根据旋转角度,计算出新的四个端点。最后将四个端点利用画线的方式链接起来,就能实现了
代码
利用原始四个端点及旋转角度,得到新的端点,代码如下:
int x_new = (x_old - x_center)*cos(theta) - (y_old - y_center)*sin(theta) + x_center;
int y_new = (x_old - x_center)*sin(theta) + (y_old - y_center)*cos(theta) + y_center;
上式以一个端点的计算为例
x_old和y_old代表该端点的原始坐标,theta代表绕矩形旋转中心的旋转角度,x_center和y_center代表旋转中心的坐标。这些点坐标可以是世界坐标,也可以是图像坐标,都可以直接带入。只不过要注意theta的正负。上述公式代表theta是,x轴正方向向右,y轴正方向向上的坐标系下,逆时针旋转的角度。显然如果是图像中的像素坐标点计算,你应该把theta加一个负号,因为图像y轴也就是v轴,是朝下的
没什么难度,实际上还是二维坐标变换那一套东西,唯一需要注意的就是结合情况觉得左乘还是右乘旋转矩阵罢了。我有另外一篇文章介绍过,感兴趣可以去阅读
下面一段代码是我为了画一个旋转车体的代码,变量是我的定义方式,根据名字容易自行理解
// 画出车的矩形
std::vector<cv::Point> car_rect_points_standard;
int length_half = BIRD_CAR_LENGTH/BIRD_SCALE/2;
int width_half = BIRD_CAR_WIDTH/BIRD_SCALE/2;
car_rect_points_standard.push_back(cv::Point(car_point_grid.x - length_half, car_point_grid.y - width_half));
car_rect_points_standard.push_back(cv::Point(car_point_grid.x + length_half, car_point_grid.y - width_half));
car_rect_points_standard.push_back(cv::Point(car_point_grid.x + length_half, car_point_grid.y + width_half));
car_rect_points_standard.push_back(cv::Point(car_point_grid.x - length_half, car_point_grid.y + width_half));
// 车体需要根据偏航角yaw进行调整
int rx0 = car_point_grid.x;
int ry0 = car_point_grid.y;
float a = -m_pose_now.yaw;
std::vector<cv::Point> car_rect;
for (int i = 0; i < 4; i++) {int x = car_rect_points_standard[i].x;int y = car_rect_points_standard[i].y;int x0 = (x - rx0)*cos(a) - (y - ry0)*sin(a) + rx0;int y0 = (x - rx0)*sin(a) + (y - ry0)*cos(a) + ry0;car_rect.push_back(cv::Point(x0, y0));
}cv::Mat m_image_run_show = m_image_run.clone();
for (int i = 0; i < 4; i++)
{cv::line(m_image_run_show, car_rect[i], car_rect[(i + 1) % 4], cv::Scalar(255), 1, 8, 0);
}
结论
利用二维点的坐标变换,求出新的坐标点
Opencv画出斜矩形相关推荐
- [html] 使用svg画出一个矩形
[html] 使用svg画出一个矩形 <svg width="400" height="200" viewbox="0 0 2000 1000& ...
- 小明学会画几何图形了,他能根据要求,画出空心矩形。
1373: 画图---4 时间限制: 1 Sec 内存限制: 128 MB 提交: 255 解决: 159 [提交] [状态] [讨论版] [命题人:hexl] 题目描述 小明学会画几何图形了,他能根 ...
- java画出斜椭圆_【转】画图java源代码,只画直线,矩形,椭圆
/* *只画直线,矩形,椭圆,只能向右下角画 * *PainterPanel extends JPanel implements MouseListener *addMouseListener(thi ...
- opencv画直线,矩形
opencv 画直线要画一条线,你只需要告诉函数这条线的起点和终点.我们下面会画一条从左上方到右下角的蓝色线段. import numpy as np import cv2# Create a bla ...
- 用python的opencv画出一棵树的骨架
如果你也想赚钱,实现财务自由,但接触不到优质的人脉和资源,可以到公June浩:成长home,发"资源" ,就会看到我吐血整理的168条保姆级零基础吸金秘籍,跟着我一起亲历毕业5年. ...
- OpenCV—画出时钟并动态同步系统时间
本文是看了网上一个博客的实例,觉得很好玩,复制代码,做了一些修改,调通了之后,做的一些分享.参考原文为:http://blog.csdn.net/xingchenbingbuyu/article/de ...
- 使用openCV画出一幅图像的直方图
// 对单通道图像做直方图 // #include "cv.h" #include "highgui.h" #include <stdio.h> # ...
- opencv 画出各种滤波器二维图像 证明拉普拉斯滤波器是一个高通滤波器
实验: 将滤波器模板,利用傅里叶变换,转换到频域内,将低频中心由图像左上角转换到图像中心.显示滤波器模板图像. 从拉普拉斯滤波器模板图像中,可以看出,中心部分为黑色,阻止了低频信息通过,外围为白色,通 ...
- opencv画白色实心矩形(去除上下黑边)
import cv2 import os import numpy as npdir_1 = "./raw/" dir_2 = "./result/"# 获得文 ...
最新文章
- myeclipse调试java
- 皮一皮:这是什么鬼畜产品!
- 双循环格局对话国际农民丰收节交易会 谋定农业贸易高质量
- c语言 fscanf的头文件,fscanf函数在哪个头文件中
- Date和Timestamp 的区别
- mongodb 批量插入_MongoDB批量插入– MongoDB插入很多
- scratch编程作品展示
- Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)
- 西工大机考《 ERP原理及应用》大作业网考
- 企业级代码静态测试工具Helix QAC——技术规格
- 先思索后动笔:论讨论与结论的区别
- 2021年山东省职业院校技能大赛中职组“网络安全”赛项规程
- 云原生IDE:iVX首个通用且强大无代码开发平台
- 18W快充4000毫安电量 魅族魅蓝Note5续航实测
- 【亲测有用】腾讯会议共享PPT,并开启演讲者模式
- MAC新手教程:十分钟轻松熟悉Mac系统
- 【2023软考】信息系统监理师与系统集成项目管理工程师哪个更好考?
- 自动更换壁纸的小软件:likecan
- 列几点一些软件或APP的Bug和对其建议
- 机构数据总打架,微博终于把手机市场的事儿说清楚了