适用小白,大佬勿喷

个人配置:vs2013 ; opencv 3.0 ;

直接上效果图

注意:右下角的水印把中心点挡住了,要仔细看才能看到

下面是代码:

#include <iostream>
#include<opencv2\opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#define PI 3.1415926using namespace cv;
using namespace std;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 * PI - theta;if (s <= 0.01)h = 0;}hue = (int)(h * 180 / PI);saturation = (int)(s * 100);intensity = (int)(i * 100);
}Mat picture_red(Mat input)
{Mat frame;Mat srcImg = input;frame = srcImg;waitKey(1);int width = srcImg.cols;int height = srcImg.rows;int x, y;double B = 0.0, G = 0.0, R = 0.0, H = 0.0, S = 0.0, V = 0.0;Mat vec_rgb = Mat::zeros(srcImg.size(), CV_8UC1);for (x = 0; x < height; x++){for (y = 0; y < width; y++){B = srcImg.at<Vec3b>(x, y)[0];G = srcImg.at<Vec3b>(x, y)[1];R = srcImg.at<Vec3b>(x, y)[2];RGB2HSV(R, G, B, H, S, V);//红色范围,范围参考的网上。可以自己调if ((H >= 312 && H <= 360) && (S >= 17 && S <= 100) && (V>18 && V < 100))vec_rgb.at<uchar>(x, y) = 255;/*cout << H << "," << S << "," << V << endl;*/}}/*imshow("hsv", vec_rgb);*/return vec_rgb;}void O_x1y1(Mat in, double *x1, double *y1, double *x2, double *y2){Mat matSrc = in;/*Mat matSrc = imread("qwer9.png", 0);*/GaussianBlur(matSrc, matSrc, Size(5, 5), 0);//高斯滤波,除噪点vector<vector<Point> > contours;//contours的类型,双重的vectorvector<Vec4i> hierarchy;//Vec4i是指每一个vector元素中有四个int型数据。//阈值threshold(matSrc, matSrc, 100, 255, THRESH_BINARY);//图像二值化//寻找轮廓,这里注意,findContours的输入参数要求是二值图像,二值图像的来源大致有两种,第一种用threshold,第二种用cannyfindContours(matSrc.clone(), contours, hierarchy, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));/// 计算矩vector<Moments> mu(contours.size());for (int i = 0; i < contours.size(); i++){mu[i] = moments(contours[i], false);}///  计算矩中心:vector<Point2f> mc(contours.size());for (int i = 0; i < contours.size(); i++){mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);}/// 绘制轮廓Mat drawing = Mat::zeros(matSrc.size(), CV_8UC1);for (int i = 0; i < contours.size(); i++){Scalar color = Scalar(255);//drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());//绘制轮廓函数circle(drawing, mc[i], 4, color, -1, 8, 0);}*x1 = mc[0].x;*y1 = mc[0].y;*x2 = mc[contours.size()-1].x;*y2 = mc[contours.size() - 1].y;imshow("outImage", drawing);}int main()
{double xx1, yy1, xx2, yy2;double x1, y1, x2, y2;Mat matSrc = imread("qwer4.png");Mat middle = picture_red(matSrc);O_x1y1(middle, &xx1, &yy1, &xx2, &yy2);x1 = xx1;y1 = yy1;x2 = xx2;y2 = yy2;imshow("原图", matSrc);imshow("red", picture_red(matSrc));cout << "红点:" << x1 << ", " << y1 << "; " << "红点1:" << x2 << ", " << y2 << endl;waitKey();return 0;
}

如有不足,望指点

opencv识别图像红色区域,并输出红色区域中心点坐标相关推荐

  1. OpenCV放大图像:多输出

    OpenCV放大图像:多输出 放大图像:多输出 建造 示例的源代码 解释 设置标题和名称空间 创建Dnn Superres对象 阅读模型 设置模型 给出节点名称和缩放因子 放大图像 放大图像:多输出 ...

  2. OpenCV放大图像:单输出

    OpenCV放大图像:单输出 放大图像:单输出 建造Building 解释 设置标题和名称空间 创建Dnn Superres对象 阅读模型 设置模型 放大图像 python中的一个例子 放大图像:单输 ...

  3. 图形轨迹c语言,OpenCV识别图像上的线条轨迹

    如果图片上有线条,图形什么的,人的眼睛可以直接看出来,这是人的直接反应.那么如何让电脑识别呢? 图片在内存中是以二维矩阵的形式存储的,如果是彩图,则是GBR三通道,灰度图则是单通道.本教程用OpenC ...

  4. c++ 解析从浏览器端传过来的图像base64编码,并转换成opencv识别的格式

    from: c++ 解析从浏览器端传过来的图像base64编码,并转换成opencv识别的格式 #include <cstdint> #include <fstream> #i ...

  5. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  6. Java基于opencv实现图像数字识别(一),java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  7. java图片降噪_Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  8. opencv 识别长方形_使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现. 2.我这里使用的OpenCV版本是3 ...

  9. Java基于opencv实现图像数字识别(一)

    Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...

最新文章

  1. linux字符串转为二进制,Linux printf将十进制转换为二进制?
  2. java设计模式4--建造者模式(Builder)
  3. selection at the technology management
  4. vue项目封装axios
  5. Unity项目代码书写规范
  6. java切换jdk版本_切换JDK版本quick
  7. 信息学奥赛一本通 1090:含k个3的数 | OpenJudge NOI 1.5 30
  8. 解决SQLite异常:library routine called out of sequence
  9. 基于Twemproxy的Redis集群方案
  10. django中的querydict对象_Django之MTV实战(2)
  11. linux网络编程 mingw,Windows网络编程
  12. EDA课程设计(设计一个4时隙的时分复用模块)
  13. 基于Matlab的数字水印设计——基于空域的水印处理系统
  14. mysql reconnect_在设置了MYSQL_OPT_RECONNECT之后,mysql_ping是否还有必要?
  15. mysql远程主机强迫关闭了_channal经常关闭
  16. 黑产反诈有方法,异常识别我在行—欺诈反洗钱等领域用得最多的经典算法
  17. Gitlab项目上传
  18. 上传附件格式限制与内容校验
  19. 每次打开Photoshop显示失败恢复文件清理方法
  20. 巴士博弈hdu1846

热门文章

  1. 计算机应用在我们生活中的哪些方面,计算机在我们生活中的应用
  2. 【QT Graphics/View】自定义动态矩形框DyRectangle
  3. python实现PDF文件合并操作,附可直接使用的exe文件
  4. Unity中Animation连续被调用时,Animation Event偶尔不触发
  5. 用Python分析下王小波与李银河写情书最爱用哪些词
  6. springboot 上传图片存储在后台,并指定存储路径
  7. IDEA中建包时如何把包分开
  8. 安卓报错E/EGL_adreno: tid 3927: eglSurfaceAttrib(1334): error 0x3009 (EGL_BAD_MATCH)
  9. 如何在mysql 中建立有关联关系的表
  10. 事业单位招聘计算机类面试自我介绍,事业单位面试自我介绍范文2分钟|2019事业单位面试自我介绍范文...