OpenCV encuentra el círculo en la imagen y marca el centro del círculo

1. Información general

  Caso: ingrese una imagen para encontrar un círculo en la imagen y marque el centro del círculo

  Pasos de implementación:

    1. Introduzca la imagen original

    2. Imagen en escala de grises

    3. Binarización de imágenes

    4. Realizar operaciones morfológicas para eliminar el ruido.

    5. Detección de bordes

    6. Descubrimiento de contornos

    7. Filtre los contornos de los objetos según el área y la relación de aspecto

    8. Encuentra el centro del círculo y dibuja el centro del círculo.

    9. Dibuje el centro del círculo en la imagen original y envíelo

2. Ejemplo de código

//【1】载入图像
    Mat src = imread(filePath);
    Mat src_clone = src.clone();
    if(src.empty()){
        qDebug()<<"图片为空";
        return;
    }
    imshow("src",src);
    //21】转灰度图
    Mat gray;
    cvtColor(src,gray,COLOR_BGR2GRAY);
    //【3】图像二值化
    threshold(gray,gray,0,255,THRESH_BINARY|THRESH_OTSU);
    imshow("threshold",gray);
    //【4】执行形态学开操作去除噪点
    Mat kernel = getStructuringElement(MORPH_RECT,Size(20,20),Point(-1,-1));
    morphologyEx(gray,gray,MORPH_OPEN,kernel,Point(-1,-1),1);
    imshow("morphologyEx",gray);

    //【5】边缘检测
    Canny(gray,gray,0,255);
    imshow("canny",gray);

    //【6】轮廓发现
    vector<vector<Point>> contours;
    vector<Vec4i> her;
    findContours(gray,contours,her,RETR_TREE,CHAIN_APPROX_SIMPLE);
    Mat resultImage = Mat::zeros(gray.size(),CV_8UC3);
    RNG rng(12345);
    double area = 0.0;
    Point pRadius;
    for(size_t i = 0;i<contours.size();i++){
        double area = contourArea(contours[i],false);
         //【7】根据面积及纵横比过滤轮廓
        if(area>200){
            Rect rect = boundingRect(contours[i]);
            float scale = float(rect.width)/float(rect.height);
            if(scale<1.1&&scale>0.9){
                drawContours(resultImage,contours,i,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),-1);
                int x = rect.width/2;
                int y = rect.height/2;
                 //【8】找出圆心并绘制
                pRadius=Point(rect.x+x,rect.y+y);
                circle(resultImage,pRadius,2,Scalar(0,0,255),2);
            }
        }

    }
     imshow("resultImage",resultImage);
    //【9】在原图上绘制圆心,这一步要不要都行,因为坐标都找出来了,可以随便标注
    circle(src_clone,pRadius,2,Scalar(0,0,255),2);
    imshow("src_clone",src_clone);

3. Ejemplo de imagen

 Los beneficios de este artículo, gratis para recibir el paquete de materiales de aprendizaje de desarrollo Qt, video técnico, que incluye (base del lenguaje C ++, introducción a la programación Qt, mecanismo de señal y ranura QT, dibujo de imagen de desarrollo de interfaz QT, red QT, programación de base de datos QT, QT proyecto de combate, QSS, OpenCV, módulo rápido, preguntas de la entrevista, etc.) ↓↓↓↓↓↓Ver abajo↓↓Haga clic en la parte inferior del artículo para recibir la tarifa↓↓

Supongo que te gusta

Origin blog.csdn.net/m0_60259116/article/details/129047762
Recomendado
Clasificación