『OpenCV3』霍夫变换原理及实现

ρ = x*cosθ + y*sinθ

基本原理

到这里问题似乎解决了，已经完成了霍夫变换的求解，但是如果像下图这种情况呢？

k=∞是不方便表示的，而且q怎么取值呢，这样不是办法。因此考虑将笛卡尔坐标系换为：极坐标表示

void hough() {
Mat souImg = imread("建筑.png");
imshow("原始图片", souImg);
Mat contour;
Canny(souImg, contour, 50, 200);
imshow("轮廓图片", contour);
int H_row;
if (contour.cols > contour.rows)
H_row = contour.cols;
else
H_row = contour.rows;
Mat H(3*H_row, 180, CV_8S, Scalar(0));
std::cout << H_row << std::endl;

float theta, rho;
for (int i = 0; i < contour.rows; i++) {
for (int j = 0; j < contour.cols; j++) {
if (contour.at<uchar>(i, j) > 0) {
for (theta = 0; theta < 180; ++theta) {
rho = floor(i*cos(theta*CV_PI / 180) + j*sin(theta*CV_PI / 180));
try {
H.at<uchar>(rho + H_row, theta) += 1;
}
catch (...) {
std::cout << i << j << rho << theta << std::endl;
return;
}
}
}
}
}
imshow("H", H);
waitKey(0);
}


1、霍夫变换

void hough() {
cv::Mat image = cv::imread("road.png");
cv::Mat midImage;
cv::Canny(image, midImage, 50, 200, 3);
std::vector<cv::Vec2f> lines;
cv::HoughLines(midImage, lines, 1, CV_PI / 180, 150);  // 输入的时二值图像，输出vector向量
for (size_t i=0; i < lines.size(); i++) {
float rho = lines[i][0]; //就是圆的半径r
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));

cv::line(image, pt1, pt2, cv::Scalar(55, 100, 195), 1); //Scalar函数用于调节线段颜色，就是你想检测到的线段显示的是什么颜色

cv::imshow("边缘检测后的图", midImage);
cv::imshow("最终效果图", image);
}
}


2、概率霍夫变换

void houghp() {
cv::Mat image = cv::imread("road.png");
cv::Mat midImage;
cv::Canny(image, midImage, 50, 200, 3);
std::vector<cv::Vec4i> lines;
cv::HoughLinesP(midImage, lines, 1, CV_PI / 180, 50);  // 输入的时二值图像，输出vector向量
for (int i=0; i < lines.size(); i++) {
cv::Point pt1(lines[i][0], lines[i][1]);
cv::Point pt2(lines[i][2], lines[i][3]);
cv::line(image, pt1, pt2, cv::Scalar(0, 255, 255));
}
cv::imshow("概率霍夫变换", image);
}


posted @ 2018-11-02 16:11  叠加态的猫  阅读(8152)  评论(1编辑  收藏  举报