描述

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画出斜矩形相关推荐

  1. [html] 使用svg画出一个矩形

    [html] 使用svg画出一个矩形 <svg width="400" height="200" viewbox="0 0 2000 1000& ...

  2. 小明学会画几何图形了,他能根据要求,画出空心矩形。

    1373: 画图---4 时间限制: 1 Sec 内存限制: 128 MB 提交: 255 解决: 159 [提交] [状态] [讨论版] [命题人:hexl] 题目描述 小明学会画几何图形了,他能根 ...

  3. java画出斜椭圆_【转】画图java源代码,只画直线,矩形,椭圆

    /* *只画直线,矩形,椭圆,只能向右下角画 * *PainterPanel extends JPanel implements MouseListener *addMouseListener(thi ...

  4. opencv画直线,矩形

    opencv 画直线要画一条线,你只需要告诉函数这条线的起点和终点.我们下面会画一条从左上方到右下角的蓝色线段. import numpy as np import cv2# Create a bla ...

  5. 用python的opencv画出一棵树的骨架

    如果你也想赚钱,实现财务自由,但接触不到优质的人脉和资源,可以到公June浩:成长home,发"资源" ,就会看到我吐血整理的168条保姆级零基础吸金秘籍,跟着我一起亲历毕业5年. ...

  6. OpenCV—画出时钟并动态同步系统时间

    本文是看了网上一个博客的实例,觉得很好玩,复制代码,做了一些修改,调通了之后,做的一些分享.参考原文为:http://blog.csdn.net/xingchenbingbuyu/article/de ...

  7. 使用openCV画出一幅图像的直方图

    // 对单通道图像做直方图 // #include "cv.h" #include "highgui.h" #include <stdio.h> # ...

  8. opencv 画出各种滤波器二维图像 证明拉普拉斯滤波器是一个高通滤波器

    实验: 将滤波器模板,利用傅里叶变换,转换到频域内,将低频中心由图像左上角转换到图像中心.显示滤波器模板图像. 从拉普拉斯滤波器模板图像中,可以看出,中心部分为黑色,阻止了低频信息通过,外围为白色,通 ...

  9. opencv画白色实心矩形(去除上下黑边)

    import cv2 import os import numpy as npdir_1 = "./raw/" dir_2 = "./result/"# 获得文 ...

最新文章

  1. myeclipse调试java
  2. 皮一皮:这是什么鬼畜产品!
  3. 双循环格局对话国际农民丰收节交易会 谋定农业贸易高质量
  4. c语言 fscanf的头文件,fscanf函数在哪个头文件中
  5. Date和Timestamp 的区别
  6. mongodb 批量插入_MongoDB批量插入– MongoDB插入很多
  7. scratch编程作品展示
  8. Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)
  9. 西工大机考《 ERP原理及应用》大作业网考
  10. 企业级代码静态测试工具Helix QAC——技术规格
  11. 先思索后动笔:论讨论与结论的区别
  12. 2021年山东省职业院校技能大赛中职组“网络安全”赛项规程
  13. 云原生IDE:iVX首个通用且强大无代码开发平台
  14. 18W快充4000毫安电量 魅族魅蓝Note5续航实测
  15. 【亲测有用】腾讯会议共享PPT,并开启演讲者模式
  16. MAC新手教程:十分钟轻松熟悉Mac系统
  17. 【2023软考】信息系统监理师与系统集成项目管理工程师哪个更好考?
  18. 自动更换壁纸的小软件:likecan
  19. 列几点一些软件或APP的Bug和对其建议
  20. 机构数据总打架,微博终于把手机市场的事儿说清楚了

热门文章

  1. vue计算属性和监听器区别
  2. 使用jQuery读取Excel表格
  3. 我的web安全工程师学习之路——规划篇
  4. 二层交换三层交换路由器区别
  5. Vue+Element实现表格筛选
  6. CAD——将图形移动到指定点的方法(此处以捕捉坐标系原点为例)
  7. 网络安全基础知识中间件简单介绍
  8. python:实现画钻石draw diamond(附完整源码)
  9. 《鹰猎长空》疫情之后,欧洲最关注中国电影市场哪些方面?
  10. 淘宝等电商平台API接口评论,item_review-获得商品评论