霍夫变换
一、霍夫直线变换:
HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold,double minlineLength=0, double maxLineGap=0 )
参数解释:
image: 边缘检测后的图像;
lines: 储存着检测到的直线的参数对的四维数组vector<Vec4f>,分别为起始点和终止点的x,y坐标;
rho : 生成极坐标时的像素扫描步长,一般取值1;
theta: 生成极坐标时的角度步长, 一般取值1度 (即CV_PI/180);
threshold: 检测到直线中所需最少的的曲线交点 ;
minLinLength: 最小直线长度,舍弃长度低于该值的直线;
maxLineGap:最大间隔,即直线之间间隔在该值以内进行合并。
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int arc, char** argv)
{
Mat src, gray_img,canny_img;
src = imread("1.jpg");
namedWindow("input",CV_WINDOW_AUTOSIZE);
imshow("input", src);
cvtcolor(src, gray_img, CV_BGR2GRAY);
Canny(gray_img, canny_img, 100, 200);
vector<Vec4i> plines;
Scalar color = Scalar(255, 255, 255);//因为是在灰度图像上画,所以要为灰度值
//霍夫直线检测
HoughLinesP(canny_img, plines, 1, CV_PI / 180.0, 10,0,10);
for (int i = 0; i < plines.size(); i++) {
Vec4i hline = plines[i];
line(canny_img, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3,8);
}
imshow("output", canny_img);
waitKey(0);
return 0;
}
运行结果如下:
二、霍夫圆变换
首先确定半径的区间,依次指定一半径,从0到360度变换,每一个像素点则可以得到一个关于a,b的曲线,遍历边缘检测后的像素,对于一指定r,找到所有曲线交点最多的点,该交点即为圆心坐标,圆心半径都有了,圆即找到了。
opencv对应的API函数:
HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double param1, double param2,int minRadius, int maxRadius);
参数解释:
image:输入图像矩阵,要求是灰度图像;
circles:储存着检测到的圆的参数对的三维数组vector<Vec3f>,分别为圆心坐标和圆的半径;
method:canny边缘检测方法( CV_HOUGH_GRADIENT);
dp:金字塔层数;
minDist:两个圆心之间的最小距离;
param1:是Canny边缘检测的低阈值,高阈值被自动置为低阈值的两倍;
param2:中心点累加器阈值(候选圆心);
minRadius:最小半径;
maxRadius:最大半径。
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int arc, char** argv)
{
Mat src,dst, gray_img, blur_img;
src = imread("2.jpg");
namedWindow("input",CV_WINDOW_AUTOSIZE);
imshow("input", src);
cvtColor(src, gray_img, CV_BGR2GRAY);
medianBlur(gray_img, blur_img, 3);
vector<Vec3f> pcircles;
//霍夫圆检测
HoughCircles(blur_img, pcircles, CV_HOUGH_GRADIENT, 1, 10, 100, 30, 5, 50);
src.copyto(dst);
for (int j = 0; j < pcircles.size(); j++) {
Vec3f pcircle = pcircles[j];
circle(dst, Point(pcircle[0], pcircle[1]), pcircle[2], Scalar(0, 0, 255), 2);
circle(dst, Point(pcircle[0], pcircle[1]), 2, Scalar(0, 255, 0), 2);
}
imshow("output2", dst);
waitKey(0);
return 0;
}
运行结果如下:
相关阅读
OpenCV:计时函数getTickCount、getTickFrequency
1. getTickCount() & getTickFrequency() getTickCount():返回CPU自某个时间以来走过的时钟周期数。getTickFrequency():返回CPU
SIFT在前面已经说过了,可以说在实现过程中是精益求精,用了各种手段来删除不符合条件的特征点,同时也得到了很好的效果但是实时性不
OpenCV中image.copyTo()有两种形式:1、image.copyTo(imageROI),作用是把image的内容粘贴到imageROI;2、image.copyTo(imageROI,mask),
在Mat矩阵类的成员函数中copyTo(roi , mask)函数是非常有用的一个函数,尤其是后面的mask可以实现蒙版的功能,我们用几个实例来说明
利用 OpenCV 和 Caffe,根据大合影构造“平均脸”
公司年会,大部门一起照了大合影。忽然有兴趣看看大家的平均脸是什么样子的,于是用 OpenCV 从大合影中提取出一千多名程序员的脸,构造