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) 亚像素精度
相关推荐
动能小子ohhh3 小时前
Langchain从零开始到应用落地案例[AI智能助手]【3】---使用Paddle-OCR识别优化可识别图片进行解析回答
人工智能·python·pycharm·langchain·ocr·paddle·1024程序员节
IT_陈寒3 小时前
Vue 3.4性能优化实战:5个鲜为人知的Composition API技巧让打包体积减少40%
前端·人工智能·后端
数据与人工智能律师3 小时前
数据淘金时代的法治罗盘:合法收集、使用与变现数据的边界与智慧
大数据·网络·人工智能·云计算·区块链
王哈哈^_^3 小时前
【数据集】【YOLO】【目标检测】建筑垃圾数据集 4256 张,YOLO建筑垃圾识别算法实战训推教程。
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·数据集
牛奶还是纯的好3 小时前
双目测距实战4-自标定
人工智能·3d视觉
亚马逊云开发者3 小时前
基于Redshift MCP Server+Strands Agents SDK+Bedrock AgentCore Runtime实现Agentic
人工智能
B站计算机毕业设计之家3 小时前
计算机视觉:YOLO实现目标识别+目标跟踪技术 pyqt界面 OpenCV 计算机视觉 深度学习 计算机(建议收藏)✅
python·opencv·yolo·计算机视觉·目标跟踪·口罩识别
CoovallyAIHub3 小时前
不看异常,怎么学会识别异常?用“异常”指导异常检测!——NAGL方法解析(附代码地址)
深度学习·算法·计算机视觉
机器之心3 小时前
三百年几何猜想被推翻,数学家首次发现「穿不过去」的多面体
人工智能·openai