OpenCV代码实现
#include <iostream>
#include <fstream>
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
std::cout << "Hello World!\n";
Mat src = imread("calib01.jpeg");
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY); // 转为灰度图
Mat binary;
threshold(gray, binary, 100, 255, THRESH_BINARY_INV); // 二值化
Mat dstErode;
Mat elementRect = getStructuringElement(cv::MORPH_RECT, cv::Size(2, 2));
erode(binary, dstErode, elementRect); // 形态学处理--腐蚀
Mat color;
cvtColor(dstErode, color, COLOR_GRAY2BGR); // 单通道转三通道
Mat canny;
Canny(dstErode, canny, 50, 125, 3); // 边缘检测
vector<Vec2f> lines;
cv::HoughLines(canny, lines, 1, CV_PI / 180, 80, 0, 0); // 霍夫直线查找
cout << "line number: " << lines.size() << endl; // 打印查找的直线数
for (size_t i = 0; i < lines.size(); i++)
{
Vec2f linex = lines[i];
cout << "radius: " << linex[0] << ", angle: " << 180 / CV_PI * linex[1] << endl;
float rho = lines[i][0];
float theta = lines[i][1];
cv::Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a * rho, y0 = b * rho;
pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000 * (a));
pt2.x = cvRound(x0 - 1000 * (-b));
pt2.y = cvRound(y0 - 1000 * (a));
line(color, pt1, pt2, cv::Scalar(255, 0, 0), 1);
}
vector<cv::Vec4i> lines2;
HoughLinesP(canny, lines2, 1, CV_PI / 180, 80, 10, 80); // 渐近式霍夫直线查找
cout << "line number: " << lines2.size() << endl; // 打印查找的直线数
for (size_t i = 0; i < lines2.size(); i++)
{
cv::Vec4i linex2 = lines2[i];
int dx = linex2[2] - linex2[0];
int dy = linex2[2] - linex2[1];
double angle = atan2(double(dy), dx) * 180 / CV_PI;
line(src, cv::Point(linex2[0], linex2[1]), cv::Point(linex2[2], linex2[3]), cv::Scalar(255, 0, 0), 1);
}
imwrite("result.bmp", src);
return 0;
}