当前位置:实例文章 » 其他实例» [文章]详细介绍如何使用 OpenCV 进行霍夫变换 -附(C++/Python)源码

详细介绍如何使用 OpenCV 进行霍夫变换 -附(C++/Python)源码

发布人:shili8 发布时间:2025-01-09 11:03 阅读次数:0

**霍夫变换概述**

霍夫变换是一种用于检测直线或曲线的图像处理技术。它通过在图像上检测水平、垂直或斜向直线来实现。霍夫变换可以用来检测图像中的线条,例如边缘、轮廓等。

**OpenCV 中的霍夫变换**

OpenCV 提供了一个用于霍夫变换的函数 `Canny()` 和 `HoughLines()`,分别用于检测直线和曲线。下面我们将详细介绍如何使用 OpenCV 进行霍夫变换。

### C++ 实现####1. 检测直线

cpp#include 

int main() {
 // 加载图像 cv::Mat image = cv::imread("image.jpg");

 // 转换为灰度图像 cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);

 // 应用 Canny 算法检测边缘 std::vector lines;
 cv::Canny(image, image,50,150,3, &lines);

 // 检测直线 for (int i =0; i < lines.size(); ++i) {
 double rho = lines[i][0];
 double theta = lines[i][1];

 // 计算直线的 x 和 y 坐标 int x1 = cv::round(rho * std::cos(theta));
 int y1 = cv::round(rho * std::sin(theta));

 int x2 = cv::round(rho * std::cos(theta + CV_PI /180.0));
 int y2 = cv::round(rho * std::sin(theta + CV_PI /180.0));

 // 绘制直线 cv::line(image, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(255,0,0));
 }

 // 显示结果 cv::imshow("Result", image);
 cv::waitKey(0);
 cv::destroyAllWindows();

 return0;
}


####2. 检测曲线
cpp#include 

int main() {
 // 加载图像 cv::Mat image = cv::imread("image.jpg");

 // 转换为灰度图像 cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);

 // 应用 Canny 算法检测边缘 std::vector lines;
 cv::Canny(image, image,50,150,3, &lines);

 // 检测曲线 for (int i =0; i < lines.size(); ++i) {
 double rho = lines[i][0];
 double theta = lines[i][1];

 // 计算直线的 x 和 y 坐标 int x1 = cv::round(rho * std::cos(theta));
 int y1 = cv::round(rho * std::sin(theta));

 int x2 = cv::round(rho * std::cos(theta + CV_PI /180.0));
 int y2 = cv::round(rho * std::sin(theta + CV_PI /180.0));

 // 绘制曲线 cv::line(image, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(255,0,0));
 }

 // 显示结果 cv::imshow("Result", image);
 cv::waitKey(0);
 cv::destroyAllWindows();

 return0;
}


### Python 实现####1. 检测直线
import cv2import numpy as np# 加载图像image = cv2.imread("image.jpg")

# 转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用 Canny 算法检测边缘edges = cv2.Canny(gray_image,50,150)

# 检测直线lines = cv2.HoughLines(edges,1, np.pi/180,200)
for line in lines:
 rho, theta = line[0]
 a = np.cos(theta)
 b = np.sin(theta)
 x0 = int(rho * a)
 y0 = int(rho * b)
 x1 = int((rho +100) * a)
 y1 = int((rho +100) * b)

 # 绘制直线 cv2.line(image, (x0, y0), (x1, y1), (255,0,0),2)

# 显示结果cv2.imshow("Result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()


####2. 检测曲线
import cv2import numpy as np# 加载图像image = cv2.imread("image.jpg")

# 转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用 Canny 算法检测边缘edges = cv2.Canny(gray_image,50,150)

# 检测曲线lines = cv2.HoughLines(edges,1, np.pi/180,200)
for line in lines:
 rho, theta = line[0]
 a = np.cos(theta)
 b = np.sin(theta)
 x0 = int(rho * a)
 y0 = int(rho * b)
 x1 = int((rho +100) * a)
 y1 = int((rho +100) * b)

 # 绘制曲线 cv2.line(image, (x0, y0), (x1, y1), (255,0,0),2)

# 显示结果cv2.imshow("Result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()


**注意**:上述代码示例仅供参考,具体实现可能需要根据实际需求进行调整。

其他信息

其他资源

Top