【opencv】17.提取RBG各种颜色c++代码

2024-06-16 21:08

本文主要是介绍【opencv】17.提取RBG各种颜色c++代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于HSV颜色空间的介绍可以参考这篇博客:OpenCV中HSV颜色模型及颜色分量范围。
在这里插入图片描述

提取上图各种颜色c++代码如下test.cpp,以提取蓝色、绿色、红色三种颜色为例:

#include <iostream>
#include <string>
#include <vector>#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"//g++ test.cpp `pkg-config opencv --libs --cflags` -std=c++11 -o testint main() {cv::Mat origin_bgr_img = cv::imread("pic.png");// 将BGR空间的图片转换到HSV空间cv::Mat hsv;// hsv为3通道,hsv.channels==3cv::cvtColor(origin_bgr_img, hsv, cv::COLOR_BGR2HSV);std::cout << "hsv.channels=" << hsv.channels() << std::endl;// 在HSV空间中定义蓝色cv::Scalar lower_blue = cv::Scalar(100, 50, 50);cv::Scalar upper_blue = cv::Scalar(124, 255, 255);// # 在HSV空间中定义绿色cv::Scalar lower_green = cv::Scalar(35, 50, 50);cv::Scalar upper_green = cv::Scalar(77, 255, 255);// # 在HSV空间中定义红色,红色的h值有两个范围[0,10]和[156,180]cv::Scalar lower_red_1 = cv::Scalar(0, 50, 50);cv::Scalar upper_red_1 = cv::Scalar(10, 255, 255);cv::Scalar lower_red_2 = cv::Scalar(156, 50, 50);cv::Scalar upper_red_2 = cv::Scalar(180, 255, 255);// 从HSV图像中截取出蓝色、绿色、红色,即获得相应的掩膜// cv::inRange()函数是设置阈值去除背景部分,得到想要的区域cv::Mat blue_mask, green_mask, red_mask, red_mask_1, red_mask_2;// 把hsv中的像素值在范围内的置255,不在范围内的置0,输出为掩模mask// blue_mask为单通道,blue_mask.channels==1cv::inRange(hsv, lower_blue, upper_blue, blue_mask);std::cout << "blue_mask.channels=" << blue_mask.channels() << std::endl;//   std::cout << blue_mask << std::endl;cv::inRange(hsv, lower_green, upper_green, green_mask);cv::inRange(hsv, lower_red_1, upper_red_1, red_mask_1);cv::inRange(hsv, lower_red_2, upper_red_2, red_mask_2);red_mask = red_mask_1 + red_mask_2;// 将原图像和mask(掩膜)进行按位与cv::Mat blue_res;// 三通道图像进行单通道掩模操作后,输出图像还是三通道。相当于对三通道都做了掩模。cv::bitwise_and(origin_bgr_img, origin_bgr_img, blue_res, blue_mask);cv::Mat green_res;cv::bitwise_and(origin_bgr_img, origin_bgr_img, green_res, green_mask);cv::Mat red_res;cv::bitwise_and(origin_bgr_img, origin_bgr_img, red_res, red_mask);cv::Mat background_img = cv::Mat::zeros(1000, 1900, CV_8UC3);// #最后得到要分离出的颜色图像cv::Mat res = blue_res + green_res + red_res;{int x = 100, y = 40;cv::Rect roi(x, y, origin_bgr_img.cols, origin_bgr_img.rows);cv::putText(background_img, "origin", cv::Point(x, y - 10),cv::FONT_HERSHEY_PLAIN, 1, CV_RGB(255, 255, 255), 1);//将background_img复制到img中roi指定的矩形位置origin_bgr_img.copyTo(background_img(roi));}{int x = 500, y = 40;cv::Rect roi(x, y, res.cols, res.rows);cv::putText(background_img, "hsv", cv::Point(x, y - 10),cv::FONT_HERSHEY_PLAIN, 1, CV_RGB(255, 255, 255), 1);hsv.copyTo(background_img(roi));}{int x = 900, y = 40;cv::Rect roi(x, y, res.cols, res.rows);cv::putText(background_img, "res", cv::Point(x, y - 10),cv::FONT_HERSHEY_PLAIN, 1, CV_RGB(255, 255, 255), 1);res.copyTo(background_img(roi));}{int x = 100, y = 500;cv::Rect roi(x, y, blue_res.cols, blue_res.rows);cv::putText(background_img, "blue", cv::Point(x, y - 10),cv::FONT_HERSHEY_PLAIN, 1, CV_RGB(255, 255, 255), 1);blue_res.copyTo(background_img(roi));}{int x = 500, y = 500;cv::Rect roi(x, y, green_res.cols, green_res.rows);cv::putText(background_img, "green", cv::Point(x, y - 10),cv::FONT_HERSHEY_PLAIN, 1, CV_RGB(255, 255, 255), 1);green_res.copyTo(background_img(roi));}{int x = 900, y = 500;cv::Rect roi(x, y, red_res.cols, red_res.rows);cv::putText(background_img, "red", cv::Point(x, y - 10),cv::FONT_HERSHEY_PLAIN, 1, CV_RGB(255, 255, 255), 1);red_res.copyTo(background_img(roi));}cv::imwrite("pppp.png", background_img);std::string win_name = "background_img";cv::namedWindow(win_name, cv::WINDOW_KEEPRATIO);cv::imshow(win_name, background_img);cv::waitKey(0);
}

执行编译命令:

g++ test.cpp `pkg-config opencv --libs --cflags` -std=c++11  -o test

上面程序运行结果如下图:
在这里插入图片描述

值得说明的是:

  • hsv为3通道;
  • 掩模mask为单通道;
  • 提取颜色使用HSV方法,只是通过hsv获得掩模mask,得到的掩模mask是用来和BGR图像做掩模操作;
  • 三通道图像进行单通道掩模mask操作后,输出图像还是三通道,相当于对三通道都做了掩模mask。

cv::inRange()的用法:

void inRange(InputArray src, InputArray lowerb, InputArray upperb,OutputArray dst);
src:输入图像,CV2常用Mat类型;lowerb:下限,scalar类型的像素值,单通道scalar取一个值就行,彩图3通道scalar三个值;upperb:上限,类型与lowerb同理;dst:输出图像,尺寸与src一致,类型是CV_8U,但没有指定通道数。

对于多通道的输入,输出结果是各个通道的结果相,当各通道结果都在上下限之内时,输出为255,否则为0。因此也有人将输出理解为掩码模板!


cv::bitwise_and()按位与操作,此外还有bitwise_orbitwise_xorbitwise_not这四个按位操作函数:

void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src2void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 | src2void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 ^ src2void bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray());//dst = ~src

bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=11&0=00&1=00&0=0;

bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=11|0=00|1=00|0=0;

bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0;

bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0~0=1;

这篇关于【opencv】17.提取RBG各种颜色c++代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067551

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五