原理部分参见:http://blog.csdn.net/poem_qianmo/article/details/26977557
标准霍夫变换示例:
// opencv_1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
//读取原图片
Mat Image = imread("E:\\pictures\\For_Project\\New_opencv\\1.jpg",1);
//显示原图片
namedWindow("【原图】");
imshow("【原图】", Image);
Mat srcImage = Image.clone();
Mat midImage, dstImage;
//进行边缘检测和转化为灰度图
Canny(srcImage, midImage, 50, 200, 3);
cvtColor(midImage, dstImage, CV_GRAY2RGB);
//定义矢量结构lines用于存放得到的线段矢量集合
vector<Vec2f> lines;
//进行霍夫变换
HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0);
//依次在图中绘制每条线段
for (size_t i = 0;i < lines.size();i++) {
float rho = lines[i][0], theta = lines[i][1];
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(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
}
imshow("【边缘检测后的图】",midImage);
imshow("【效果图】", dstImage);
while ((char)waitKey(1) != 'q') {}
return 0;
}
效果:
累计概率霍夫变换示例:
// opencv_1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
//读取原图片
Mat Image = imread("E:\\pictures\\For_Project\\New_opencv\\1.jpg",1);
//显示原图片
namedWindow("【原图】");
imshow("【原图】", Image);
Mat srcImage = Image.clone();
Mat midImage, dstImage;
//进行边缘检测和转化为灰度图
Canny(srcImage, midImage, 50, 200, 3);
cvtColor(midImage, dstImage, CV_GRAY2RGB);
//定义矢量结构lines用于存放得到的线段矢量集合
vector<Vec4i> lines;
//进行霍夫变换
HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);
//依次在图中绘制每条线段
for (size_t i = 0;i < lines.size();i++) {
Vec4i l = lines[i];
line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 1, LINE_AA);
}
imshow("【边缘检测后的图】",midImage);
imshow("【效果图】", dstImage);
while ((char)waitKey(1) != 'q') {}
return 0;
}
效果图:
霍夫圆变换示例:
// opencv_1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
//载入原始图和Mat变量定义
Mat srcImage = imread("E:\\pictures\\For_Project\\New_opencv\\round.jpg",1);
Mat midImage, dstImage;
//显示原始图
imshow("【原始图】", srcImage);
//转为灰度图,进行图像平滑
cvtColor(srcImage, midImage, CV_BGR2GRAY);//转化边缘检测后的图为灰度图
GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);
//进行霍夫圆变换
vector<Vec3f> circles;
HoughCircles(midImage, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);
//依次在图中绘制出圆
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
//绘制圆心
circle(srcImage, center, 3, Scalar(0, 0, 255), 3, 8, 0);
//绘制圆轮廓
circle(srcImage, center, radius, Scalar(0, 0, 255), 3, 8, 0);
}
//显示效果图
imshow("【效果图】", srcImage);
while ((char)waitKey(1) != 'q') {}
return 0;
}
效果图: