opencv如何识别图片上带颜色的圆

本文实例为大家分享了opencv识别图片上带颜色的圆的具体代码,供大家参考,具体内容如下

识别带颜色的圆,首先需要先查询该颜色的HSV值,下图部分紫色归为红色了:

比如红色:

//红色的HSV值
int low_H = 0,low_S = 123,low_V = 100;
int High_H = 5,High_S = 255,High_V = 255;

然后将图片从BGR转化成HSV,接着二值化:

cvtColor(image,src,COLOR_BGR2HSV); //从BGR-> HSV
inRange(src,Scalar(low_H,low_S,low_V),Scalar(High_H,High_S,High_V),src); //二值化

如果有噪声可以去噪(这一步可以没有):

GaussianBlur(src,src,Size(5,3 ),2,2);

接着用HoughCircles来找圆,后面的参数可以根据需要自己设置:

HoughCircles(src,circles,CV_HOUGH_GRADIENT,1,50,15,7,10,30);
//找圆,最后两个参数是圆半径范围,20是最小圆半径,30是最大圆半径

HoughCircles介绍:

HoughCircles(image,method,dp,minDist [,circles [,param1 [,param2 [,minRadius [,maxRadius]]]]])

完整代码:

#include <iostream>
#include <vector>
#include <limits>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
#include <math.h>
#include <iomanip>
#include <cstdio>

#pragma comment (lib, "opencv_core2413d.lib")
#pragma comment (lib, "opencv_highgui2413d.lib")
#pragma comment (lib, "opencv_imgproc2413d.lib")
#pragma comment (lib, "opencv_video2413d.lib")
#pragma comment (lib, "opencv_features2d2413d.lib")

using namespace std;
using namespace cv;

void drawCircle(Mat &input, const vector<Vec3f> &circles);

int main(){

 Mat image, src;//加载进来的图片

 vector<Vec3f> circles;//识别出来的圆,每一行是一个圆,第一列是圆心的x坐标,第二列是圆心的y坐标,第三列是圆的半径
 image = imread("D:/code/map3.png");
 Mat result = imread("D:/code/map3.png");//结果图

 //红色的HSV值
 int low_H = 0,low_S = 123,low_V = 100;
 int High_H = 5,High_S = 255,High_V = 255;

 cvtColor(image, src, COLOR_BGR2HSV);//从BGR->HSV
 inRange(src, Scalar(low_H, low_S, low_V), Scalar(High_H, High_S, High_V), src);//二值化

 //Reduce the noise so we avoid false circle detection
 GaussianBlur(src, src, Size(5, 3), 2, 2);

 HoughCircles(src, circles, CV_HOUGH_GRADIENT, 1, 50, 15, 7,10,30);//找圆,最后两个参数是圆半径范围,20是最小圆半径,30是最大圆半径

 drawCircle(result, circles);//画圆

 namedWindow("Display window1", WINDOW_NORMAL);//展示结果
 namedWindow("Display window2", WINDOW_NORMAL);
 resizeWindow("Display window1", 1240, 680);
 resizeWindow("Display window2", 1240, 680);
 imshow("Display window1", image);
 imshow("Display window2", result);
 waitKey(0);

 return 0;
}

void drawCircle(Mat &input, const vector<Vec3f> &circles){
 for (int i = 0; i<circles.size(); i++){
 Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
 int radius = cvRound(circles[i][2]);
 circle(input, center, radius, Scalar(255, 0, 0), 3, 8, 0);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • opencv摄像头捕获识别颜色

    本文实例为大家分享了opencv摄像头捕获识别颜色的具体代码,供大家参考,具体内容如下 #include "highgui.h" #include "iostream" using namespace std; int main() { CvCapture* pCap = cvCreateCameraCapture(1 );//这里-1也可以,不过我的电脑装的有CyberLink YouCam软件, int flag=0; //OpenCV会默认调用该摄像头,而不调

  • 基于Opencv实现颜色识别

    彩色模型   数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型.而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的. HSV模型 HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value).由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model). (1

  • opencv如何识别图片上带颜色的圆

    本文实例为大家分享了opencv识别图片上带颜色的圆的具体代码,供大家参考,具体内容如下 识别带颜色的圆,首先需要先查询该颜色的HSV值,下图部分紫色归为红色了: 比如红色: //红色的HSV值 int low_H = 0,low_S = 123,low_V = 100; int High_H = 5,High_S = 255,High_V = 255; 然后将图片从BGR转化成HSV,接着二值化: cvtColor(image,src,COLOR_BGR2HSV); //从BGR-> HSV

  • C++ opencv实现在图片上画一条线示例代码

    1 在图片上用鼠标进行操作,opencv主要用到setMouseCallback()函数. winname 窗口名称 onMouse 鼠标事件的回调函数 userdata 传递给回调函数 还有onMouse函数 event 鼠标事件 x,y 鼠标在图片上的坐标 flags 鼠标事件标志 这里有一个容易搞混的地方 void跟void* 在函数的返回值中, void 是没有任何返回值, 而 void * 是返回任意类型的值的指针. 划线还需要用到line()函数 img 图片名称 pt1 线段起点

  • python 实现识别图片上的数字

    Python 3.6 版本 Pytesseract 图像验证码识别 环境: (1) win7 64位 (2) Idea (3) python 3.6 (4) pip install pillow <&nbsp>pip install pytesseract (5) 识别引擎tesseract-ocr 安装 安装tesseract-ocr的识别引擎 第一步:下载安装包 根据https://github.com/UB-Mannheim/tesseract/wiki,找到下载安装包. 我下载

  • c#实现识别图片上的验证码数字

    public void imgdo(Bitmap img) { //去色 Bitmap btp = img; Color c = new Color(); int rr, gg, bb; for (int i = 0; i < btp.Width; i++) { for (int j = 0; j < btp.Height; j++) { //取图片当前的像素点 c = btp.GetPixel(i, j); rr = c.R; gg = c.G; bb = c.B; //改变颜色 if (r

  • Python OpenCV实现图片上输出中文

    OpenCV中在图片上输出中文一般需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件.但使用FreeType需要下载库并重新编译,过程麻烦一点. 在Python中,可以借助PIL(Python Imaging Library)模块实现,相对简单很多,需要做的只是对图像进行OpenCV格式和PIL格式的相互转换. # -*- coding: utf-8 -*- import cv2 import numpy

  • OpenCV识别图像上的线条轨迹

    如果图片上有线条,图形什么的,人的眼睛可以直接看出来,这是人的直接反应.那么如何让电脑识别呢? 图片在内存中是以二维矩阵的形式存储的,如果是彩图,则是GBR三通道,灰度图则是单通道.本教程用OpenCV去识别图形上的线条,曲线等轨迹. 软件环境:Win7-32, VS2010, OpenCV2.4.9 (1)以灰度图的方式导入图片 Mat src = imread("1.jpg", 0); (2)我的思路:根据图形中的每个像素点的差异去判断,对原图的灰度图做二值化处理,不是线条的区域像

  • Opencv+Python识别PCB板图片的步骤

    任务要求: 基于模板匹配算法识别PCB板型号 使用工具: Python3.OpenCV 使用模板匹配算法,模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,模板匹配具有自身的局限性,主要表现在它只能进行平行移动,即原图像中的匹配目标不能发生旋转或大小变化. 事先准备好待检测PCB与其对应的模板: 子模版: 基本流程如下: 1.在整个图像区域发现与给定子图像匹配的小块区域 2.选取模板图像T(给定的子图像) 3.另外需要一个待检测的图像--源图

  • OpenCV实现更改图片颜色功能

    原图效果: 更改颜色后效果: 直接上源码: #include <opencv2/opencv.hpp> #include <iostream> #include <vector> #include <cstdio> #include <cstring> using namespace cv; using namespace std; int main(int argc, char const* argv[]) { Mat srcImg = imr

  • PHP+Ajax无刷新带进度条图片上传示例

    项目需求:1.PHP+Ajax无刷新带进度条图片上传,2.带进度条.所需插件:jquery.js,jquery.form.js. 最近在做一个手机web项目,需要用到Ajax上传功图片能,项目要求PHP无刷新上传图片,并且要带进度条,下面就来讲一下我的实现方法,先看效果图 本示例需要使用的是jquery.js,jquery.form.js,demo里面包含有,你可以在文章下方进行下载. 第一步,建立前端页面index.html 此段是前端展示内容,这里需要说明的是由于input:file标签显示

  • python通过pil为png图片填充上背景颜色的方法

    本文实例讲述了python通过pil为png图片填充上背景颜色的方法.分享给大家供大家参考.具体分析如下: png图片有些是没有背景颜色,如果希望以单色(比如白色)填充背景,可以使用下面的代码,这段代码将当前目录下的 jb51.net.png图片填充了白色背景. 使用指定的颜色的背景色即可,然后把该图片用alpha通道填充到该单色背景上.  比如下面使用白色背景: im = Image.open('jb51.net.png') x,y = im.size try: # 使用白色来填充背景 fro

随机推荐