OpenCV—画直角边的直线(粗线)
前言
利用OpenCV自带的函数line画粗直线时,发现一个问题,线的两个端点是圆角边,而不是直角边。如下图:
但是,我想画直角边的粗直线,在网上找了半天,没有相关的,所以就写了一个函数,分填充,和不填充的, 可以画水平,竖直、倾斜的粗直线,只用给出起点和终点两个坐标(中间)就行,效果还不错,分享给大家。
一、实现
不说废话,直接上代码:
void DrawLine(InputOutputArray src, Point startPoint, Point endPoint, int width, cv::Scalar color, bool fillFlag)
{vector<Point> rectPoint(4);int tempWidth = width / 2;int offsetX = endPoint.x - startPoint.x;int offsetY = endPoint.y - startPoint.y;if (offsetX == 0 && offsetY == 0)return;else if (offsetX == 0) {rectPoint[0].x = GetResult(startPoint.x, tempWidth, false, src.cols());rectPoint[0].y = startPoint.y;rectPoint[1].x = rectPoint[0].x;rectPoint[1].y = endPoint.y;rectPoint[2].x = GetResult(startPoint.x, tempWidth, true, src.cols());rectPoint[2].y = endPoint.y;rectPoint[3].x = rectPoint[2].x;rectPoint[3].y = startPoint.y;}else if (offsetY == 0) {rectPoint[0].x = startPoint.x;rectPoint[0].y = GetResult(startPoint.y, tempWidth, false, src.rows());rectPoint[1].x = endPoint.x;rectPoint[1].y = rectPoint[0].y;rectPoint[2].x = endPoint.x;rectPoint[2].y = GetResult(startPoint.y, tempWidth, true, src.rows());rectPoint[3].x = startPoint.x;rectPoint[3].y = rectPoint[2].y;}else {bool negFlag1, negFlag2;negFlag1 = offsetX < 0 ? true : false;negFlag2 = offsetY < 0 ? true : false;int lineLength = sqrt(pow(offsetX, 2) + pow(offsetY, 2));double sin = abs(offsetY) * 1.0 / lineLength;double cos = abs(offsetX) * 1.0 / lineLength;int dX = sin * tempWidth;int dY = cos * tempWidth;//从起点按照顺时针的方式获取顶点的坐标if (negFlag1 && negFlag2) {rectPoint[0].x = GetResult(startPoint.x, dX, false, src.cols());rectPoint[0].y = GetResult(startPoint.y, dY, true, src.rows());rectPoint[1].x = GetResult(endPoint.x, dX, false, src.cols());rectPoint[1].y = GetResult(endPoint.y, dY, true, src.rows());rectPoint[2].x = GetResult(endPoint.x, dX, true, src.cols());rectPoint[2].y = GetResult(endPoint.y, dY, false, src.rows());rectPoint[3].x = GetResult(startPoint.x, dX, true, src.cols());rectPoint[3].y = GetResult(startPoint.y, dY, false, src.rows());}else if (!negFlag1 && !negFlag2) {rectPoint[0].x = GetResult(startPoint.x, dX, true, src.cols());rectPoint[0].y = GetResult(startPoint.y, dY, false, src.rows());rectPoint[1].x = GetResult(endPoint.x, dX, true, src.cols());rectPoint[1].y = GetResult(endPoint.y, dY, false, src.rows());rectPoint[2].x = GetResult(endPoint.x, dX, false, src.cols());rectPoint[2].y = GetResult(endPoint.y, dY, true, src.rows());rectPoint[3].x = GetResult(startPoint.x, dX, false, src.cols());rectPoint[3].y = GetResult(startPoint.y, dY, true, src.rows());}else if (negFlag1 && !negFlag2) {rectPoint[0].x = GetResult(startPoint.x, dX, false, src.cols());rectPoint[0].y = GetResult(startPoint.y, dY, false, src.rows());rectPoint[1].x = GetResult(endPoint.x, dX, false, src.cols());rectPoint[1].y = GetResult(endPoint.y, dY, false, src.rows());rectPoint[2].x = GetResult(endPoint.x, dX, true, src.cols());rectPoint[2].y = GetResult(endPoint.y, dY, true, src.rows());rectPoint[3].x = GetResult(startPoint.x, dX, true, src.cols());rectPoint[3].y = GetResult(startPoint.y, dY, true, src.rows());}else {rectPoint[0].x = GetResult(startPoint.x, dX, true, src.cols());rectPoint[0].y = GetResult(startPoint.y, dY, true, src.rows());rectPoint[1].x = GetResult(endPoint.x, dX, true, src.cols());rectPoint[1].y = GetResult(endPoint.y, dY, true, src.rows());rectPoint[2].x = GetResult(endPoint.x, dX, false, src.cols());rectPoint[2].y = GetResult(endPoint.y, dY, false, src.rows());rectPoint[3].x = GetResult(startPoint.x, dX, false, src.cols());rectPoint[3].y = GetResult(startPoint.y, dY, false, src.rows());}}vector<vector<Point>> contours;contours.push_back(rectPoint);int lineWidth = fillFlag ? -1 : 1;drawContours(src, contours, -1, color, lineWidth);
}int GetResult(const int & first, const int & second, bool add, const int & max, int min)
{int result;if (add) {result = first + second;return result > max ? max : result;}else {result = first - second;return result < min ? min : result;}
}
二、效果
OpenCV—画直角边的直线(粗线)相关推荐
- opencv画直线,矩形
opencv 画直线要画一条线,你只需要告诉函数这条线的起点和终点.我们下面会画一条从左上方到右下角的蓝色线段. import numpy as np import cv2# Create a bla ...
- QT画直线 粗线和细线长短不一致
QT画直线 粗线和细线长短不一致 原因是画笔有个笔帽的样式 笔帽的样式 所谓笔帽是个很奇怪的东西, 如果搞不好的话, 很容易被迷惑到了. 笔帽会在每绘制每一截线时, 在起点和终点都添加一点点的东西, ...
- 霍夫直线检测python_python+opencv实现霍夫变换检测直线
本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意: ...
- Python 用 OpenCV 画椭圆 (5)
利用 OpenCV 自带的 ellipse() 函数画椭圆 并显示,其函数声明如下: cv2.ellipse(img, center, axes, rotateAngle, startAngle, e ...
- opencv画火车沿轨道运行-课程作业
opencv画火车沿轨道运行-课程作业 四个函数,一个循环 一. 轨道函数 二.定义可转弯小车的方法 三.定义角度函数 四.定义约束项 五.一个循环 以下附上总代码 以下效果图 写本次博客的目的主要是 ...
- OpenCV标准霍夫直线检测详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...
- 使用OpenCV画折线图
使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...
- 画直线_在鸡面前画一条直线,为什么它会晕?西瓜视频这知识好冷告诉答案
为什么世界有那么多的未解之谜,我们无从而知,今天我们来探讨一下在鸡面前画条直线为什么会晕?你们知道吗?今天西瓜视频这知识好冷告诉你们答案,帮助你们掌握生活中所不知道的涨知识,增加我们的知识库. 优秀创 ...
- OpenCV中霍夫直线变换
OpenCV中霍夫直线变换 首先要知道,一条直线的通用表达式为y=ax+b\color{#F00}y=ax+by=ax+b,a为直线的斜率,b为直线的截距,知道这两个参数可以唯一确定一条直线.通常我们 ...
最新文章
- 西门子数控面板图解_20190319工控维修日记(西门子系统第四讲)
- java和jvm_Java、JVM和操作系统之间的关系,写给新人,
- Service Mesh — APIGW vs ServiceMesh
- python处理json数据 乱码报错_python操作mysql中文显示乱码的解决方法
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(优雅上下线)
- BufferedReader和FileReader的区别
- Scala的自定义类型标记
- IDEA发布新版本,支持禅模式(免打扰)!
- vSphere共享存储全配置流程
- “耳边的AI助理” 出门问问发布TicPods 2系列头控真无线耳机
- 20145201 20145227 《信息安全系统设计基础》实验二 固件开发
- ES6——rest参数
- MySQL: ERROR13(HY000):Can't get stat of的问题
- mysql order 中文版,MySQL Order By排序结果
- cocos creator fgui 按钮事件
- 简单无须Root 谷歌相机Gcam 打开即闪退的解决方法
- 酷狗音乐网站前端JS的逆向过程
- gb28181协议流媒体实现为rtp荷载ps流,将h264流打包成ps流。
- 天气很热,用Python告诉你奶茶哪家最好喝性价比最高?
- Dubbo Spring Cloud 逆向分析服务注册事件变化的处理过程
热门文章
- 数据库服务器常见操作系统,服务器的数据库和操作系统
- Java后端解密微信小程序手机号数据
- 利用临时二维码实现在电脑浏览器上的微信扫码登陆功能 - EasyWeChat版
- 开源项目车牌识别EasyPR的使用
- 使用脚本自动创建AD中的层次化结构容器及对象
- vb wps 链接单元格_vb读取WPS的EXCEL文档并另存为其他
- 如何做好数据分析报告(四)
- Discover the Web(找浏览器网页)
- [Redis]redis-cli命令大全
- 【数学建模】“华为杯”高级神经网络Keras(Python代码实现)