基础函数
在 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) | 亚像素精度 |