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) 亚像素精度
相关推荐
墨染天姬3 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志3 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114243 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠3 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光3 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好3 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力4 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo4 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
xiaozhazha_4 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能
枫叶林FYL4 小时前
【自然语言处理 NLP】7.2.2 安全性评估与Constitutional AI
人工智能·自然语言处理