opencv识别不同颜色的圆

//---------------------------------【头文件、命名空间包含部分】----------------------------
//        描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------   
#include <opencv2/opencv.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
using namespace cv;
using namespace std;
int main()
{
    //载入图像并显示
    Mat srcImage = imread("1.jpg", 1);
    Mat dstImage;
    cvtColor(srcImage, dstImage, CV_RGB2GRAY);

    imshow("灰度化效果图", dstImage);
    Mat dstGaussian;
    GaussianBlur(dstImage, dstGaussian, Size(5, 5), 0, 0);
    imshow("Gaussian效果图", dstGaussian);
    //【4】进行霍夫圆变换
    vector<Vec3f> circles;
    HoughCircles(dstGaussian, circles, HOUGH_GRADIENT, 1.5, 10, 100, 100, 0, 0);

    Mat rgb;// , hsv;
    rgb = srcImage;

    for (size_t i = 0; i < circles.size(); i++)
    {
        string str_t="o";
        //参数定义
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        //绘制圆心
        //circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
        //绘制圆轮廓
        //circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);
        

        printf("第%d,坐标(%d,%d)像素的R:%d,G:%d,B:%d\n", i,center.x,center.y, srcImage.at<Vec3b>(center)[2], srcImage.at<Vec3b>(center)[1], srcImage.at<Vec3b>(center)[0]);
        putText(srcImage, std::to_string(i), center, cv::FONT_HERSHEY_SIMPLEX, 0.45, CV_RGB(255, 230, 0), 1.8);
        //putText(srcImage, str_t, center, cv::FONT_HERSHEY_SIMPLEX, 0.45, CV_RGB(255, 230, 0), 1.8);
        double r_t, g_t, b_t;
        r_t =(double)srcImage.at<Vec3b>(center)[2];
        g_t = (double)srcImage.at<Vec3b>(center)[1];
        b_t = (double)srcImage.at<Vec3b>(center)[0];
        double r_d, g_d, b_d;
        if ((r_t + g_t + b_t)>0)
        {
            r_d = r_t / (r_t + g_t + b_t);
            g_d = g_t / (r_t + g_t + b_t);
            b_d = b_t / (r_t + g_t + b_t);
            printf("%lf\n",r_d);
            printf("%lf\n", g_d);
            printf("%lf\n", b_d);


            if ((r_d >= 0.4) && (g_d <= 0.3) && (b_d <= 0.1))
            {
                str_t = "r";
                printf("红色\n");
            }
            else if ((b_d >= 0.4) && (g_d <= 0.3) && (r_d <= 0.1))
            {
                str_t = "蓝色";
                printf("蓝色\n");
            }
            else if ((g_d >= 0.4) && (r_d <= 0.2))
            {
                str_t = "绿色";
                printf("绿色\n");
            }
            else
            {
                str_t = "其他";
                printf("其他\n");
            }
        }
        else
        { 
            printf("其他\n");
        }
    }

    //【6】显示效果图  
    imshow("【效果图】", srcImage);
    waitKey(0);
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/kobesdu/article/details/106429376
今日推荐