OpenCV(十四):绘制直线

基础函数

在 OpenCV(C++ / Python)中,绘制直线使用函数

c++接口:

c++ 复制代码
void cv::line(
    cv::InputOutputArray img,   // 要绘制的图像
    cv::Point pt1,              // 起点
    cv::Point pt2,              // 终点
    const cv::Scalar& color,    // 线条颜色 (B, G, R)
    int thickness = 1,          // 线宽
    int lineType = LINE_8,      // 线型
    int shift = 0               // 坐标小数位数(通常为0)
);

Python 接口:

python 复制代码
cv2.line(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)

参数详解

参数 含义 示例
img 要绘制的图像(numpy 数组 / cv::Mat) img = np.zeros((400, 400, 3), np.uint8)
pt1 起点坐标 (x1, y1) 或 cv::Point(x1, y1)
pt2 终点坐标 (x2, y2) 或 cv::Point(x2, y2)
color 线条颜色,BGR 格式 (255, 0, 0) 表示蓝色
thickness 线宽(像素) 1、2、3...
lineType 线型 cv2.LINE_4(4连通)、cv2.LINE_8(8连通)、cv2.LINE_AA(抗锯齿)
shift 坐标缩放精度(用于小数坐标) 一般设为 0

示例

python示例

python 复制代码
import cv2
import numpy as np

# 创建黑色画布
img = np.zeros((400, 400, 3), dtype=np.uint8)

# 绘制一条红色线段
cv2.line(img, (50, 50), (350, 350), (0, 0, 255), 2)

# 绘制一条绿色线段(抗锯齿)
cv2.line(img, (50, 350), (350, 50), (0, 255, 0), 3, cv2.LINE_AA)

cv2.imshow("Lines", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

c++示例

c++ 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    Mat img = Mat::zeros(Size(400, 400), CV_8UC3);

    // 红色直线
    line(img, Point(50, 50), Point(350, 350), Scalar(0, 0, 255), 2);

    // 绿色抗锯齿直线
    line(img, Point(50, 350), Point(350, 50), Scalar(0, 255, 0), 3, LINE_AA);

    imshow("Lines", img);
    waitKey(0);
    return 0;
}

进阶用法

绘制多条线

可以在循环中多次调用 cv::line():

python 复制代码
for i in range(0, 400, 40):
    cv2.line(img, (i, 0), (i, 399), (255, 255, 0), 1)

生成类似网格的效果。

绘制垂直或水平线

python 复制代码
# 水平线
cv2.line(img, (0, 200), (400, 200), (255, 0, 0), 2)

# 垂直线
cv2.line(img, (200, 0), (200, 400), (255, 0, 0), 2)

使用浮点坐标(shift 参数)

如果需要亚像素精度的坐标(例如检测出的浮点线位置):

复制代码
cv::line(img, cv::Point2f(100.5f, 50.5f), cv::Point2f(300.5f, 150.5f), cv::Scalar(0,255,0), 1, cv::LINE_AA);

结合 HoughLines 绘制检测到的直线

python 复制代码
edges = cv2.Canny(gray, 50, 150)
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)

for rho, theta in lines[:,0]:
    a, b = np.cos(theta), np.sin(theta)
    x0, y0 = a*rho, b*rho
    x1, y1 = int(x0 + 1000*(-b)), int(y0 + 1000*(a))
    x2, y2 = int(x0 - 1000*(-b)), int(y0 - 1000*(a))
    cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 2)

总结

功能 函数 特点
绘制直线 cv2.line() / cv::line() 可设置颜色、线宽、抗锯齿
多线绘制 循环调用 适合可视化检测结果
精确绘制 支持浮点坐标(shift) 亚像素精度
相关推荐
国科安芯3 分钟前
长期在轨的计算底座:商业空间站与在轨服务飞行器健康管理中的抗辐射MCU—— 面向可维护空间平台的分层容错与安全通信综述
人工智能·单片机·嵌入式硬件·安全·低轨卫星·抗辐射
科技新资讯11 分钟前
AI如何批量处理Excel文件? 从数据合并、清洗到自动生成报表,看看 AI Agent 怎么完成任务
大数据·人工智能·excel
郝学胜-神的一滴25 分钟前
AI 编程智能体 22:解析器赋能与实战落地全指南
人工智能·程序人生·游戏·unity·游戏引擎
Sayai42 分钟前
让动漫角色复刻真人动作!MiniMax H3 动作控制实战:一段视频驱动角色动画(12G 显存,附模型下载)
人工智能·aigc·音视频·comfyui·动作捕捉·minimax
绿算技术44 分钟前
从单点性能到体系效能:存算网创新联合体启航
大数据·人工智能
衡石科技1 小时前
让多轮问数保持口径一致:Data Agent 的上下文、偏好与学习开关
人工智能·学习·安全
航天智算1 小时前
300 万预算 国产信创遥感 AI 全自动处理生产线配置实战
大数据·人工智能·昇腾·国产算力·算力适配
yangmu32031 小时前
ReShade + GITC DLSS 5 插件安装与调参指南
人工智能
AI 编程助手GPT2 小时前
GPT 排的日志时间线差一小时?用 zoneinfo 复现夏令时回拨
人工智能·python·gpt
Thanks_ks2 小时前
【第 003 讲】全面认识 Python:语言起源与设计哲学 | 行业地位与流行趋势 | 技术优势与应用领域 | 技术边界与工程局限
人工智能·python·数据分析·编程语言·python 入门·web 开发·python 之禅