c++ opencv直线检测 固定方向
时间: 2024-12-27 08:24:04 浏览: 10
### C++ OpenCV 进行固定方向直线检测
为了实现特定角度的直线检测,可以利用霍夫变换中的参数来筛选符合条件的角度范围内的线段。下面是一个基于C++和OpenCV库的例子程序,该例子展示了如何设置条件以仅保留指定方向上的线条。
#### 设置编译环境
构建此代码需使用GCC以及OpenCV头文件和库。例如命令如下所示[^1]:
```bash
g++ DetectFixedDirectionLines.cpp -I/usr/local/include/opencv4 \
-lopencv_core -lopencv_imgproc -lopencv_highgui -o DetectFixedDirectionLines
```
#### 示例代码
以下是用于检测给定图像中具有预定取向角(即θ值接近于设定阈值)的直边的具体实现:
```cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void detect_fixed_direction_lines(const Mat& src, double angle_threshold_degrees) {
// 转换成灰度图并应用边缘检测算法
Mat gray, edges;
cvtColor(src, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, edges, Size(7, 7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
vector<Vec4i> lines;
HoughLinesP(edges, lines, 1, CV_PI / 180, 50, 50, 10);
for (size_t i = 0; i < lines.size(); ++i) {
Vec4i l = lines[i];
Point pt1(l[0], l[1]), pt2(l[2], l[3]);
// 计算斜率从而得到角度
float dx = static_cast<float>(pt2.x - pt1.x);
float dy = static_cast<float>(pt2.y - pt1.y);
if(dx != 0){
float slope = dy / dx;
double theta = atan(slope) * 180 / CV_PI;
// 判断是否满足预设的方向角度误差范围内
if(abs(theta - angle_threshold_degrees) <= 10 || abs(theta + 180 - angle_threshold_degrees) <= 10 ||
abs(theta - angle_threshold_degrees - 180) <= 10 ) {
line(src, pt1, pt2, Scalar(0, 0, 255), 3, LINE_AA);
}
}
}
}
int main(int argc, char** argv[]) {
string filename = "path_to_image.jpg";
Mat img = imread(filename, IMREAD_COLOR);
if(img.empty()){
cout << "Could not open or find the image\n";
return -1;
}
namedWindow("Detected Lines", WINDOW_AUTOSIZE);
imshow("Detected Lines", img);
// 假设要找的是水平线,则angle_threshold_degrees=0°;垂直线则为90°。
const double angle_threshold_degrees = 0;
detect_fixed_direction_lines(img, angle_threshold_degrees);
waitKey();
}
```
上述代码通过`HoughLinesP()`函数获取所有可能存在的线段,并计算每条线段对应的倾斜角度θ。接着判断这些角度是否位于用户定义的目标角度附近(考虑到可能存在正负π弧度差异),最后只绘制那些符合要求的线段到原始图片上显示出来。
阅读全文