opencv之颜色过滤只留下图片中的红色区域
如图,这次需要在图片中找到卷尺的红色刻度,所以需要对图像做过滤,只留下红色部分。
一开始的想法是分别找到RGB值,然后找到红色区域的部分保留就可以了,不过好像很难确定红色区域的RGB取值范围,所以要把图片转化到HSV空间中去。
在opencv中直接使用cvCvtColor函数就可以啦。
- IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );
- cvCvtColor(image,hsv,CV_BGR2HSV);
opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180) ,S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80),V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。
所以接下来要做的就是遍历图像,获取图像每个像素点的H,S,V分量,然后做判断,满足条件的就保留,不满足的就赋值为黑色。
我是用opencv中的IplImage来存储图片的。
IplImage获取像素点的方式如下:
- CvScalar s_hsv = cvGet2D(hsv, j, i);//获取像素点为(i, j)点的HSV的值,i是width值,j是height值
IplImage对像素点赋值的方式如下:
- CvScalar s;
- cvSet2D(hsv, j ,i, s);//对(i,j)处的像素点赋值
分别取得H,S,V分量,注意图像转化的时候BGR2HSV,所以s.val[0]是B或H的值,s.val[1]是G或S的值,s.val[2]则是R或V的值。
因为师弟喜欢用CvMat,所以输入都改成了CvMat,使用的时候inputImage是希望过滤的图片,outputImage则为输出图片,因为outputImage会在函数中进行空间申请与赋值,所以传入参数的时候直接把它设成NULL就可以了。
另外要注意一点,因为是对彩色图像做实验,所以如果传入的图片不是3通道的彩色图片,那么就会出内存错误。
以下打开图片或创建图片的方式都是单通道方式,会出现内存错误。
IplImage *input = cvLoadImage(path, 0),
CvMat* M = cvCreateMat(4,4,CV_32FC1); //或是8UC1, 因为C1表示nChannel = 1,也就是单通道
- void colorFilter(CvMat *inputImage, CvMat *&outputImage)
- {
- int i, j;
- IplImage* image = cvCreateImage(cvGetSize(inputImage), 8, 3);
- cvGetImage(inputImage, image);
- IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );
- cvCvtColor(image,hsv,CV_BGR2HSV);
- int width = hsv->width;
- int height = hsv->height;
- for (i = 0; i < height; i++)
- for (j = 0; j < width; j++)
- {
- CvScalar s_hsv = cvGet2D(hsv, i, j);//获取像素点为(j, i)点的HSV的值
- /*
- opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180)
- S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80),
- V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。
- */
- CvScalar s;
- if (!(((s_hsv.val[0]>0)&&(s_hsv.val[0]<8)) || (s_hsv.val[0]>120)&&(s_hsv.val[0]<180)))
- {
- s.val[0] =0;
- s.val[1]=0;
- s.val[2]=0;
- cvSet2D(hsv, i ,j, s);
- }
- }
- outputImage = cvCreateMat( hsv->height, hsv->width, CV_8UC3 );
- cvConvert(hsv, outputImage);
- cvNamedWindow("filter");
- cvShowImage("filter", hsv);
- waitKey(0);
- cvReleaseImage(&hsv);
- }
关于函数还有一点要说明,H分量我取得是(0,8),(120,180),S与V分量没有做筛选,如果按照注释部分的进行筛选结果不是很好。
结果如图:
opencv之颜色过滤只留下图片中的红色区域的更多相关文章
- laravel的filter()方法的使用 (方法使用给定的回调函数过滤集合的内容,只留下那些通过给定真实测试的内容)
filter 方法使用给定的回调函数过滤集合的内容,只留下那些通过给定真实测试的内容: $collection = collect([1, 2, 3, 4]); $filtered = $collec ...
- 当SD卡拔出时,返回首页,栈中的activity都要清除,只留下首页的activity
目标:当SD卡拔出时,返回首页,栈中的activity都要清楚,只留下首页的activity 我在清单中注册了一个静态广播: <receiver android:name="com.p ...
- WIN10下设置惠普HP1050等打印机打印颜色,只打黑白或彩色
今天同事问了一个问题,如何在WIN10下,设置惠普打印机只打印黑白, 上网搜了下,没有找到任何信息,只有在WIN8前系统设置的内容,经过几番折腾,得出此文. WIN10下设置惠普HP1050等打印机打 ...
- 清除html中的标记,只留下文字
/// <summary>/// 清除html中的标记,只留下文字./// </summary>/// <param name="HTML">& ...
- git删除所有历史提交记录,只留下最新的干净代码
git删除所有历史提交记录,只留下最新的干净代码 1.Checkout git checkout --orphan latest_branch 2. Add all the files git add ...
- OpenCV (C++) 颜色跟随
#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; ...
- Spark1.3使用外部数据源时条件过滤只要是字符串类型的值均报错
CREATE TEMPORARY TABLE spark_tbls USING org.apache.spark.sql.jdbc OPTIONS ( url 'jdbc:mysql://hadoop ...
- OpenCV——视频颜色识别
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace c ...
- opencv::基于颜色跟踪检测
基于颜色跟踪 inRange过滤 形态学操作提取 轮廓查找 外接矩形获取 位置标定
随机推荐
- linux 设置pip 镜像 Pip Warning:–trusted-host 问题解决方案
pip升级到7.0以后,在使用http镜像进行包安装及升级的时候往往会有如下提示: Collecting beautifulsoup4The repository located at mirrors ...
- Promise最佳实践(转)
本文作者:IMWeb dekuchen 原文出处:IMWeb社区 未经同意,禁止转载 有关Promise的几个问题 基础概念 一:什么是Promise 国内比较流行的看法: 阮一峰: Promise ...
- 供安全工程师实用的SOC模型
一.背景 如今,安全概念满天飞,什么安全运营中心(SOC).威胁情报(TI).态势感知等等不一而足,这些概念及其背后代表的安全思想都很好,不过很多产品为了迎合国内的工作汇报都做成了很多Dashboar ...
- JDBC的驱动是如何加载的
注:本文出处:http://www.cnblogs.com/jiaoyiping/ 转载请保留出处 JDBC定义了一套接口,数据库产品的提供商会实现这些接口来提供自己的数据库驱动程序,这是个很好的面向 ...
- 关于在Linux下apache-maven的安装
本文所涉及到的软件如下:jdk版本号:1.7.0_45apache-maven版本号:3.1.1 apache-maven的安装过程如下: apache-maven的官方网址:http://maven ...
- Java秒杀简单设计三:数据封装类
上一篇https://www.cnblogs.com/taiguyiba/p/9828984.html 整合了数据库表和Dao层代码 这一篇继续设计数据封装类: 涉及到获取秒杀地址,查询,返回秒杀结果 ...
- Java秒杀简单设计二:数据库表和Dao层设计
Java秒杀简单设计二:数据库表Dao层设计 上一篇中搭建springboot项目环境和设计数据库表 https://www.cnblogs.com/taiguyiba/p/9791431.html ...
- [分布式系统学习]阅读笔记 Distributed systems for fun and profit 抽象 之二
本文是阅读 http://book.mixu.net/distsys/abstractions.html 的笔记. 第二章的题目是"Up and down the level of abst ...
- C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较
由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...
- 地址转换函数:inet_aton & inet_ntoa & inet_addr和inet_pton & inet_ntop
在Unix网络编程中,我们常用到地址转换函数,它将ASCII字符串(如"206.62.226.33")与网络字节序的二进制值(这个值保存在套接口地址结构中)间进行地址的转换. 1. ...