OpenCV 霍夫变换(直线检测、圆检测)

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
    Mat src, src_gray, dst;
    src = imread("test1.jpg");

    char INPUT_TITLE[] = "input image";

    imshow(INPUT_TITLE, src);

    Canny(src, src_gray, 150, 200);
    cvtColor(src_gray, dst, CV_GRAY2BGR);
    imshow("edge image", src_gray);
    imshow("gray", dst);

    //方法1(标准霍夫变换)
    //vector<Vec2f> lines;
    //HoughLines(src_gray, lines, 1, CV_PI / 180, 150, 0, 0);
    //for (size_t i = 0; i < lines.size(); i++) {
    //    float rho = lines[i][0]; // 极坐标中的r长度
    //    float 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));//对一个double型的数进行四舍五入,并返回一个整型数!
    //    pt1.y = cvRound(y0 + 1000 * (a));
    //    pt2.x = cvRound(x0 - 1000 * (-b));
    //    pt2.y = cvRound(y0 - 1000 * (a));
    //    line(dst, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);
    //}


    //第二种方法(概率霍夫变换)
    vector<Vec4f> plines;
    HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 10);
    Scalar color = Scalar(0, 0, 255);
    for (size_t i = 0; i < plines.size(); i++) {
    Vec4f hline = plines[i];
    line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
    }

    imshow("效果图",dst);

    waitKey(0);
    return 0;

}

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
    Mat src, src_gray;
    src = imread("3 input.bmp");

    char INPUT_TITLE[] = "input image";

    imshow(INPUT_TITLE, src);

  //转成灰度图
    cvtColor(src, src_gray, COLOR_BGR2GRAY);

    GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2);

    //进行霍夫圆变换
    vector<Vec3f> circles;
    HoughCircles(src_gray, circles, 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(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);       //绘制圆的轮廓
        circle(src, center, radius, Scalar(155, 50, 255), 3, 8, 0);

    }

    imshow("效果图", src);

    waitKey(0);
    return 0;

}

霍夫圆检测一般只会找出最大的一个圆

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题可以拆分成几个小问题来解决: 1. 如何用 OpenCV 测量一根头发的直径? 首先,我们需要将头发的图像进行二值化处理,使头发的轮廓更加明显。然后,通过轮廓检测,找到头发的最外层轮廓。接下来,我们可以使用 Hough 变换检测头发轮廓的直线,从而确定头发的直径。 2. 如何用 OpenCV 识别形并计算出直径和面积? OpenCV 提供了一个函数 `cv2.HoughCircles()` 可以用来检测形。该函数会返回每个检测到的形的心坐标和半径。通过半径的两倍即可计算直径。面积可以通过 πr² 计算得出。 3. 如何用 OpenCV 识别椭并计算长轴短轴和面积? OpenCV 提供了一个函数 `cv2.fitEllipse()` 可以用来拟合椭。该函数会返回椭的长轴、短轴和旋转角度。通过长轴和短轴即可计算面积。 4. 如何用 OpenCV 识别一块不规则图形并计算出长宽以及面积? 可以使用轮廓检测检测不规则图形的轮廓,然后使用 `cv2.boundingRect()` 函数来获取该轮廓的外接矩形。外接矩形的宽度和高度即为长和宽,面积可以通过宽度和高度相乘得出。 下面是具体的代码实现: ```python import cv2 # 读取图片 img = cv2.imread('hair.jpg', 0) # 二值化处理 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 轮廓检测 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 检测头发的直径 for cnt in contours: # 拟合直线 rows, cols = img.shape[:2] [vx, vy, x, y] = cv2.fitLine(cnt, cv2.DIST_L2, 0, 0.01, 0.01) lefty = int((-x * vy / vx) + y) righty = int(((cols - x) * vy / vx) + y) diameter = righty - lefty # 检测形并计算直径和面积 circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) if circles is not None: circles = np.uint16(np.around(circles)) for i in circles[0, :]: # 画出形 cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2) # 计算直径和面积 diameter = i[2] * 2 area = np.pi * i[2] ** 2 # 检测并计算长轴短轴和面积 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: # 拟合椭 if len(cnt) >= 5: ellipse = cv2.fitEllipse(cnt) # 画出椭 cv2.ellipse(img, ellipse, (0, 255, 0), 2) # 计算长轴短轴和面积 major_axis = max(ellipse[1]) minor_axis = min(ellipse[1]) area = np.pi * major_axis * minor_axis / 4 # 检测不规则图形并计算长宽和面积 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: # 获取外接矩形 x, y, w, h = cv2.boundingRect(cnt) # 画出矩形 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) # 计算长宽和面积 length = w width = h area = length * width ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值