前言

利用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—画直角边的直线(粗线)相关推荐

  1. opencv画直线,矩形

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

  2. QT画直线 粗线和细线长短不一致

    QT画直线 粗线和细线长短不一致 原因是画笔有个笔帽的样式 笔帽的样式 所谓笔帽是个很奇怪的东西, 如果搞不好的话, 很容易被迷惑到了. 笔帽会在每绘制每一截线时, 在起点和终点都添加一点点的东西, ...

  3. 霍夫直线检测python_python+opencv实现霍夫变换检测直线

    本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意: ...

  4. Python 用 OpenCV 画椭圆 (5)

    利用 OpenCV 自带的 ellipse() 函数画椭圆 并显示,其函数声明如下: cv2.ellipse(img, center, axes, rotateAngle, startAngle, e ...

  5. opencv画火车沿轨道运行-课程作业

    opencv画火车沿轨道运行-课程作业 四个函数,一个循环 一. 轨道函数 二.定义可转弯小车的方法 三.定义角度函数 四.定义约束项 五.一个循环 以下附上总代码 以下效果图 写本次博客的目的主要是 ...

  6. OpenCV标准霍夫直线检测详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...

  7. 使用OpenCV画折线图

    使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...

  8. 画直线_在鸡面前画一条直线,为什么它会晕?西瓜视频这知识好冷告诉答案

    为什么世界有那么多的未解之谜,我们无从而知,今天我们来探讨一下在鸡面前画条直线为什么会晕?你们知道吗?今天西瓜视频这知识好冷告诉你们答案,帮助你们掌握生活中所不知道的涨知识,增加我们的知识库. 优秀创 ...

  9. OpenCV中霍夫直线变换

    OpenCV中霍夫直线变换 首先要知道,一条直线的通用表达式为y=ax+b\color{#F00}y=ax+by=ax+b,a为直线的斜率,b为直线的截距,知道这两个参数可以唯一确定一条直线.通常我们 ...

最新文章

  1. 西门子数控面板图解_20190319工控维修日记(西门子系统第四讲)
  2. java和jvm_Java、JVM和操作系统之间的关系,写给新人,
  3. Service Mesh — APIGW vs ServiceMesh
  4. python处理json数据 乱码报错_python操作mysql中文显示乱码的解决方法
  5. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(优雅上下线)
  6. BufferedReader和FileReader的区别
  7. Scala的自定义类型标记
  8. IDEA发布新版本,支持禅模式(免打扰)!
  9. vSphere共享存储全配置流程
  10. “耳边的AI助理” 出门问问发布TicPods 2系列头控真无线耳机
  11. 20145201 20145227 《信息安全系统设计基础》实验二 固件开发
  12. ES6——rest参数
  13. MySQL: ERROR13(HY000):Can't get stat of的问题
  14. mysql order 中文版,MySQL Order By排序结果
  15. cocos creator fgui 按钮事件
  16. 简单无须Root 谷歌相机Gcam 打开即闪退的解决方法
  17. 酷狗音乐网站前端JS的逆向过程
  18. gb28181协议流媒体实现为rtp荷载ps流,将h264流打包成ps流。
  19. 天气很热,用Python告诉你奶茶哪家最好喝性价比最高?
  20. Dubbo Spring Cloud 逆向分析服务注册事件变化的处理过程

热门文章

  1. 数据库服务器常见操作系统,服务器的数据库和操作系统
  2. Java后端解密微信小程序手机号数据
  3. 利用临时二维码实现在电脑浏览器上的微信扫码登陆功能 - EasyWeChat版
  4. 开源项目车牌识别EasyPR的使用
  5. 使用脚本自动创建AD中的层次化结构容器及对象
  6. vb wps 链接单元格_vb读取WPS的EXCEL文档并另存为其他
  7. 如何做好数据分析报告(四)
  8. Discover the Web(找浏览器网页)
  9. [Redis]redis-cli命令大全
  10. 【数学建模】“华为杯”高级神经网络Keras(Python代码实现)