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 线宽(像素) 123...
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) 亚像素精度
相关推荐
Damon小智5 分钟前
眼见不一定为实:WAIC 2026 探展合合信息,实测 AI 去反光 + AI 跨模态鉴伪两项黑科技
人工智能·ocr
AvatarAI_Walker8 分钟前
2026年7月安徽健康 IP 孵化:四家机构服务特点与场景关注方向梳理
大数据·人工智能·tcp/ip·精选
栋***t13 分钟前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
不爱记笔记18 分钟前
音视频转笔记工具横评2026,通义听悟、Ai好记、NotebookLM 实测对比
人工智能·笔记·ai·音视频·飞书·obsidian
Highcharts.js28 分钟前
如何下载使用Highcharts Grid 开发web可编辑表格
前端·人工智能·grid 表格·web 表格·在线编辑表格·highcharts表格安装·表格开发工具
服装 AI 增长黑客41 分钟前
AI落地服装店:从流量焦虑到经营闭环,哪些能力真实可用?
人工智能
weiwin12343 分钟前
MAF 入门(7):在 MAF 中使用 RAG
人工智能
JuiceFS1 小时前
GPFS、Alluxio、JuiceFS 怎么选?一文看懂架构与适用场景
人工智能·后端
爱吃程序猿的喵1 小时前
LingBot-Map 复现与原理剖析:基于 Geometric Context Transformer 的流式 3D 重建
人工智能·python·深度学习·计算机视觉·3d·transformer
俊哥V1 小时前
每日 AI 研究简报 · 2026-07-23
人工智能·ai