opencv转HSV再找红色圆——霍夫圆检测
红色的H范围大概是(0~8)∪(160,180) S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80), V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。判断区域颜色是否相同,可以直接比较这两个区域像素的HSV值。如果要完全相同,则各像素点的H,S,V的值都要一样,否则可以有一定误差范围(具体是多少就只能自己估计了)。
/*****************************************************************************************
1、五子棋棋盘棋子识别检测2021.2.25:开始,初版,找到了棋盘边缘图像*****************************************************************************************/
#include<opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <stdlib.h> //srand()和rand()函数
#include <time.h> //time()函数
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
#include<opencv2\opencv.hpp>
#include <opencv2\imgproc\types_c.h>
#include<windows.h>
using namespace std;
using namespace cv;
using namespace ml;#define PI 3.1415926
#define ROTATED_SIZE 600 //透视变换后的表盘图像大小
#define CUT_SIZE 0 //透视变换时四周裁剪长度#define debug_show_picture 1 //是否显示部分调试图片,方便调试
/*打印等级,修改后面的宏定义可以改变函数输出打印等级*/
#define ALG_PRTINT_LEVER PRINT_LEVEL_UNLIMIT#define ALG_PRTINT(...) SAL_printf(__VA_ARGS__)
#define ALG_PRT(...) ALG_PRTINT(__FUNCTION__, __LINE__, PRINT_LEVEL_UNLIMIT, __VA_ARGS__)
#define ALG_DBG(...) ALG_PRTINT(__FUNCTION__, __LINE__, PRINT_LEVEL_DBG, __VA_ARGS__)
#define ALG_WAR(...) ALG_PRTINT(__FUNCTION__, __LINE__, PRINT_LEVEL_WRN, __VA_ARGS__)
#define ALG_ERR(...) ALG_PRTINT(__FUNCTION__, __LINE__, PRINT_LEVEL_ERR, __VA_ARGS__)/***********************************************************************************************
* @enum HAT_SAL_PRT_LEVEL_E
* @brief 打印输出的等级
***************************************************************************************************/
typedef enum _PRT_LEVEL_E_
{PRINT_LEVEL_ERR = 0, /*错误打印信息*/PRINT_LEVEL_WRN = 1, /*警告打印信息*/PRINT_LEVEL_DBG = 2, /*调试打印信息*/PRINT_LEVEL_UNLIMIT = 3, /*无限制打印信息*/PRINT_LEVEL_NOPRT = 4, /*没有打印信息*/
} PRT_LEVEL_E;/*******************************************************************************
Function: SAL_printf
Description: 该函数能够通过设置的打印等级ALG_PRTINT_LEVER,来控制是否输出相关语句
Input:
Output:
Return:
0: Successful
ohters: Failed
*******************************************************************************/
void SAL_printf(const char *pFun, UINT line, PRT_LEVEL_E levelParam, const char *fmt, ...)
{static INT8 g_printfInfo[4][16] = { "ERR", "WAR", "DBG", "INF" };va_list p;if (ALG_PRTINT_LEVER == PRINT_LEVEL_NOPRT || levelParam == PRINT_LEVEL_NOPRT){return;}if (levelParam <= ALG_PRTINT_LEVER){va_start(p, fmt);printf("[DIYUN_ALG][%s][%s][%4d] ", g_printfInfo[levelParam], pFun, line);vprintf(fmt, p);va_end(p);}
}//RGB转HSV
void RGB2HSV(double red, double green, double blue, double& hue, double& saturation, double& intensity)
{double r, g, b;double h, s, i;double sum;double minRGB, maxRGB;double theta;r = red / 255.0;g = green / 255.0;b = blue / 255.0;minRGB = ((r<g) ? (r) : (g));minRGB = (minRGB<b) ? (minRGB) : (b);maxRGB = ((r>g) ? (r) : (g));maxRGB = (maxRGB>b) ? (maxRGB) : (b);sum = r + g + b;i = sum / 3.0;if (i<0.001 || maxRGB - minRGB<0.001){h = 0.0;s = 0.0;}else{s = 1.0 - 3.0*minRGB / sum;theta = sqrt((r - g)*(r - g) + (r - b)*(g - b));theta = acos((r - g + r - b)*0.5 / theta);if (b <= g)h = theta;elseh = 2 * 3.1415926 - theta;if (s <= 0.01)h = 0;}hue = (int)(h * 180 / 3.1415926);saturation = (int)(s * 100);intensity = (int)(i * 100);
}int main()
{float ret = 0;float final_value = 0;float min_value = 0;/*最新刻度值*/float max_value = 450;/*最大刻度值*/float Min_scale_value = 10;/*最小格单位*/Mat srcImage0 = imread("1.jpg");//读取图片 int begin, duration;begin = clock(); //Mat srcImage0 = imread("app/1.jpg");//读取图片 if (srcImage0.empty()){cout << " 待预测图像不存在: " << endl;printf("[ALG ERROR][函数:%s][行号:%d],图片未正常读取,请检查输入路径十分正确 \n", __FUNCTION__, __LINE__, 1);cout << " 待预测图像不存在: " << endl;}Mat srcImage;resize(srcImage0, srcImage0, Size(960,540));//cvtColor(srcImage0, srcImage, CV_BGR2GRAY);//srcImage = srcImage>150; // 二值化//imshow("二值化", srcImage);Mat image_copy_C3; //clone函数创建新的图片 彩色image_copy_C3 = srcImage0.clone(); //clone函数创建新的图片 int x, y;double B = 0.0, G = 0.0, R = 0.0, H = 0.0, S = 0.0, V = 0.0;int width1 = image_copy_C3.cols * 3;int height1 = image_copy_C3.rows;for (x = 0; x < height1; x++){uchar* data = image_copy_C3.ptr<uchar>(x);//获取第i行的首地址for (y = 0; y < width1; y += 3){B = data[y];G = data[y + 1];R = data[y + 2];RGB2HSV(R, G, B, H, S, V);//红色范围,范围参考的网上。可以自己调// if ((H >= 270 && H <= 360 || H >= 0 && H <= 20) && (S >= 20 && S <= 360) && (V>0 && V < 220))无人机比较好的if ((H >= 270 && H <= 360 || H >= 0 && H <= 20) && (S >= 15 && S <= 360) && (V>0 && V < 360))data[y] = data[y + 1] = data[y + 2] = 255;else data[y] = data[y + 1] = data[y + 2] = 0;}}Mat vec_rgb;cvtColor(image_copy_C3, vec_rgb, CV_BGR2GRAY);//灰度化//【3】srcImage取大于阈值119的那部分vec_rgb = vec_rgb > 120;namedWindow("hsv空间图像", 0);imshow("hsv空间图像", vec_rgb);waitKey(1);/****2、圆形检测 *******************************************************/// 第五个参数 圆的圆心之间的最小距离vector<Vec3f> circles;//第二个参数:累加器阈值//HoughCircles(vec_rgb, circles, CV_HOUGH_GRADIENT, 1.5, 200, 150, 70, 10, 388);//【5】依次在图中绘制出圆 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]);cout << "圆心 " << i << "= " << center << ";\n" << endl;cout << "半径= " << i << "= " << radius << ";\n" << endl;//绘制圆心 circle(srcImage0, center, 3, Scalar(0, 255, 0), -1, 8, 0);//绘制圆轮廓 circle(srcImage0, center, radius, Scalar(155, 50, 255), 3, 8, 0);//绘制圆心 circle(srcImage0, center, 3, Scalar(0, 255, 0), -1, 8, 0);//绘制圆轮廓 circle(srcImage0, center, radius, Scalar(155, 50, 255), 3, 8, 0);}cout << "共检测到圆" << circles.size() << " 个圆" << ";\n" << endl;//【6】显示效果图 duration = clock() - begin;ALG_ERR("圆形识别用时约: %d毫秒 \n", duration * 1000 / CLOCKS_PER_SEC);namedWindow("【彩色效果图】", 0);//参数为零,则可以自由拖动imshow("【彩色效果图】", srcImage0);while (1){ALG_ERR("程序运行结束,请查收\n");}return 0;}
opencv转HSV再找红色圆——霍夫圆检测相关推荐
- OpenCV中霍夫圆检测
OpenCV中霍夫圆检测 在直线检测中,变换后在r−θr-\thetar−θ空间内曲线交点,然后根据阈值来得到直线.在圆中需要有三个变量圆心坐标和半径,因此变换后的空间在三维空间,根据三维空间中的曲线 ...
- OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测
基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...
- OpenCV 霍夫圆检测
圆的表示式是: 其中aa和bb表示圆心坐标,rr表示圆半径,因此标准的霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆形检测,此时效率就会很低,所以OpenCV中使用霍夫梯度法进行圆形的检测. ...
- OpenCV基于Python霍夫圆检测—标准霍夫圆检测
标准霍夫圆检测 1. 简介 2. 标准霍夫圆检测 2.1 情形一 2.2 情形二 2.3 情形三 3. 程序演示 4. 结尾 参考资料 1. 简介 1972年,R. D. Duda和P. E. Har ...
- Opencv 霍夫变换 霍夫圆检测
霍夫变换是一种特征提取术,在了解霍夫变换 霍夫检测之前 需要首先明白什么是霍夫空间:以圆形举例子,弄明白形状的原理,直线的变换与检测也就不难理解 霍夫空间,是一种三维空间,三个坐标分别为圆的横纵坐标, ...
- opencv c++ 霍夫圆检测
1.原理 a)对某点,以其为圆心的圆为无数(一圈圈的圆),将其从x-y平面坐标系上转换到r-θ极坐标系上后,则变成了以r.θ为自变量,为固定值,x.y为因变量的式子: b)其余点作同样操作,可以得到, ...
- OpenCV_09 模版匹配和霍夫变换:霍夫线检测+霍夫圆检测
1 模板匹配 1.1 原理 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最 ...
- 使用Python测试霍夫圆检测
目录 1. 目的 2. 霍夫园检测的原理 3. 使用opencv测试 1. 目的 记录使用python学写霍夫圆检测的过程 2. 霍夫园检测的原理 略!别怪我,这个涉及到数学原理.有时间我再进行补充, ...
- 霍夫圆检测(HoughCircles)
霍夫圆检测 1.霍夫圆检测 从平面坐标到极坐标需要转换三个参数,C(x0,y0,r)C(x_0,y_0,r)C(x0,y0,r),其中(x0,y0)(x_0,y_0)(x0,y0)为圆心. 假 ...
最新文章
- 报告软件测试错误的规范
- mongodb系列~mongodb慢语句(2)
- jdk8 List集合 Stream distinct() 去重代码示例
- python爬虫贴吧_Python爬虫简单实现,贴吧图片一键下
- 服务器:浅谈 Nginx 性能调优,太实用了!
- 推文科技:AI解决方案助力内容出海
- 外包公司到底值不值去?
- docker利用Dockerfile来制作镜像
- CHM文件出现的常见错误及解决办法
- BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)
- 课堂破冰游戏“猜猜他是谁”
- 网站技术架构发展之我见--[引子]
- Solidity的三种合约间的调用方式 call、delegatecall 和 callcode
- 截流式合流制设计流量计算_截流式合流管道的设计流量.PPT
- matlab矩阵求逆的模块,matlab矩阵求逆矩阵
- VS1005 HiRes 高清录音开发模块 BOB MK2
- AWVS批量扫描-妈妈再也不用担心我不会用awvs批量扫描了
- 数字信号处理实验线性卷积与循环卷积计算
- Flex常用布局,了解一下
- java 日期calendar_java成神之——date和calendar日期的用法
热门文章
- Linux下标准I/O库函数fopen、fclose函数的使用方法
- c#串口编程(傻瓜教程,手把手教你学会)
- memset函数的使用原理
- Python3.7.1学习(一):redis的连接和简单使用
- CSS布局页面之盒子模型
- 冒险岛linux服务端 143端
- win10开机蓝屏_Win10开机后没有密码输入框和“您的账户已被停用,请向系统管理员联系”,两个问题一套方案...
- java个人职业生涯规划范文
- 在当当买了python怎么下载源代码-初学Python 之抓取当当网图书页面目录并保存到txt文件...
- 俄罗斯方块源码(彩色版)