//1 累计霍夫线变换
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int thre, minLineLength, maxLineGap;
Mat src, dst;
void on_HoughLines(int, void *);
int main() {
Mat ori = imread("chess1.jpg");
namedWindow("dst");
imshow("origin", ori);
Canny(ori, src, 50, 200, 3);
cvtColor(src, dst, CV_GRAY2BGR);
imshow("canny image", src);
thre = 80;
minLineLength = 50;
maxLineGap = 10;
createTrackbar("threshold:", "dst", &thre, 300, on_HoughLines);
createTrackbar("minLine :", "dst", &minLineLength, 300, on_HoughLines);
createTrackbar("maxGap :", "dst", &maxLineGap, 20, on_HoughLines);
on_HoughLines(thre, 0);
on_HoughLines(minLineLength, 0);
on_HoughLines(maxLineGap, 0);
waitKey(0);
}
//
void on_HoughLines(int, void *) {
vector<Vec4i> lines;
Mat dstImage = dst.clone();
Mat srcImage = src.clone();
HoughLinesP(srcImage, lines, 1, CV_PI / 180, thre, minLineLength, maxLineGap);
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(186, 88, 255), 2);
}
imshow("dst", dstImage);
}
//2 霍夫圆变换
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("planet_glow.jpg");
namedWindow("origin");
imshow("origin", src);
//转出灰度图,并进行平滑,因为要进行边缘检测,最好进行平滑
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
imshow("gray", gray);;
Mat dst;
medianBlur(gray, dst, 5);;
imshow("median filter", dst);
vector<Vec3f> circles;
HoughCircles(dst, circles, HOUGH_GRADIENT, 1, 120, 100, 30, 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(src, center, 2, Scalar(0, 255, 0), 2);
//绘制轮廓
circle(src, center, radius, Scalar(0, 255, 0), 2);
}
imshow("result", src);
waitKey(0);
}
opencv_霍夫变换
猜你喜欢
转载自blog.csdn.net/csdn_dzh/article/details/79214042
今日推荐
周排行