qq_42924586 2023-10-29 22:18 采纳率: 100%
浏览 24
已结题

opencv c+识别圆形的数量和坐标等

这边我想要识别圆形的个数和蓝色圆形的个数,顺便输出其坐标,我照着网上学了学,结果出了这么个问题,有点不理解

img

img

img


#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <fstream>
#include <string>

using namespace cv;
using namespace std;

int main()
{
    int i;
    string picture = "D:\\test\\img.jpg";
    Mat gray1 = imread(picture, IMREAD_GRAYSCALE);
    vector<Vec3f> boom;
    HoughCircles(gray1,boom,1,10,110,80,10,100);
    
    ofstream outFile;
    outFile.open("D:\\test\\test.txt");
    outFile << "圆形数量: " << boom.size() << endl;
    for(i=0;i<boom.size();i++)
    {
        outFile << "圆心坐标" << boom[i] << endl;
    }

    string picture2 = "D:\\test\\img.jpg";
    Mat gray2 = imread(picture2, IMREAD_UNCHANGED);
    Mat change;
    cvtColor(gray2, change, COLOR_BGR2HSV);
    vector<Mat> mv;
    split(gray2, mv);
    mv[1] = 0;
    mv[2] = 0;
    Mat mix;
    merge(mv, mix);
    Scalar BlueL = Scalar(100, 43, 48);
    Scalar BlueH = Scalar(124, 255, 255);
    Mat mask;
    inRange(mix, BlueL, BlueH, mask);
    vector<Vec3f> boom2;
    HoughCircles(gray2, boom2, 1, 10, 110, 80, 10, 100);

    outFile << "蓝色圆形数量" << boom2.size() << endl;
    outFile.close();

    return 0;
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-30 08:23
    关注

    【以下回答由 GPT 生成】

    解答:

    1. 如何在OpenCV C++中识别图像中圆形的数量和坐标?

    OpenCV中提供了一个函数HoughCircles()来进行圆形检测。首先,需要将图像转为灰度图像,然后使用HoughCircles()函数进行圆形检测,并将检测结果保存在一个vector变量中。以下是一段示例代码:

    Mat gray = imread("image.jpg", IMREAD_GRAYSCALE);
    vector<Vec3f> circles;
    HoughCircles(gray, circles, HOUGH_GRADIENT, 1, gray.rows/8, 200, 100, 0, 0);
    

    其中,第一个参数gray是输入的灰度图像,第二个参数circles是保存检测结果的vector变量,依次保存了每个检测到的圆形的圆心坐标和半径。

    1. 如何输出圆形的数量和坐标?

    将识别到的圆形数量和圆心坐标保存在文件中。可以使用ofstream类来写入文件。以下是示例代码:

    ofstream outFile;
    outFile.open("result.txt");
    outFile << "圆形数量: " << circles.size() << endl;
    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]);
        outFile << "圆心坐标: " << center << ", 半径: " << radius << endl;
    }
    outFile.close();
    

    通过循环遍历circles向量,可以依次获得每个圆形的圆心坐标和半径,并将其写入文件。

    1. 如何改变识别的参数以获得更准确的结果?

    HoughCircles()函数的参数可以进行调整来获得更准确的结果。以下是一些常用参数的解释:

    • dp:图像分辨率与累加器分辨率的比值。默认值为1.0,表示两者相同。如果dp的值大于1,意味着累加器的分辨率低于图像的分辨率,因此检测结果也会相应减少;如果dp的值小于1,意味着累加器的分辨率高于图像的分辨率,因此检测结果会相应增加。一般情况下,选择1.0即可。

    • minDist:检测到的圆形之间的最小距离。设置为0时,意味着允许圆形重叠。一般情况下,根据具体应用场景设置一个合适的值,以避免重复检测。

    • param1:第一个方法特定的参数。对于HOUGH_GRADIENT方法,它表示Canny边缘检测的高阈值。默认值为200,可以根据具体图像调整。

    • param2:第二个方法特定的参数。对于HOUGH_GRADIENT方法,它表示检测阶段圆心累加器阈值。默认值为100,可以根据具体图像调整。

    • minRadius和maxRadius:圆形的最小和最大半径。

    根据具体的应用场景和图像特点,可以调整这些参数来获得更准确的结果。

    1. 如何使用颜色过滤来识别蓝色圆形的数量和坐标?

    可以通过颜色空间转换和颜色过滤来实现对特定颜色圆形的识别。以下是示例代码:

    Mat image = imread("image.jpg", IMREAD_COLOR);
    Mat hsv, mask;
    cvtColor(image, hsv, COLOR_BGR2HSV);
    Scalar lower_blue = Scalar(90, 70, 70);   // 蓝色的下限阈值
    Scalar upper_blue = Scalar(130, 255, 255);   // 蓝色的上限阈值
    inRange(hsv, lower_blue, upper_blue, mask);
    
    vector<Vec3f> circles;
    HoughCircles(mask, circles, HOUGH_GRADIENT, 1, 10, 100, 30, 0, 0);
    

    首先,将彩色图像转换为HSV颜色空间,然后根据蓝色的HSV阈值范围,使用inRange()函数创建一个掩膜图像。掩膜图像中,蓝色区域为白色,其他颜色为黑色。然后,将掩膜图像传递给HoughCircles()函数进行圆形检测,即可实现对蓝色圆形的识别。

    1. 我在代码中使用的参数是否合适?是否有其他可选参数需要考虑?

    参数的选择是根据具体的图像和应用场景来决定的,所以不同的情况可能需要不同的参数。可以根据实际情况进行调整和尝试,以达到最佳的识别效果。另外,OpenCV还提供了其他参数和检测方法,可以根据具体需求进行选择。请参考OpenCV官方文档以了解更多内容。

    希望以上解答对你有帮助!



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 已采纳回答 11月8日
  • 创建了问题 10月29日