日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時間:2025/3/21 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【opencv】17.提取RBG各种颜色c++代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關于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()函數(shù)是設置閾值去除背景部分,得到想要的區(qū)域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); }

執(zhí)行編譯命令:

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,但沒有指定通道數(shù)。

對于多通道的輸入,輸出結果是各個通道的結果相與,當各通道結果都在上下限之內時,輸出為255,否則為0。因此也有人將輸出理解為掩碼模板!


cv::bitwise_and()是按位與操作,此外還有bitwise_or、bitwise_xor、bitwise_not這四個按位操作函數(shù):

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是對二進制數(shù)據(jù)進行“與”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“與”操作,1&1=1,1&0=0,0&1=0,0&0=0;

bitwise_or是對二進制數(shù)據(jù)進行“或”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0;

bitwise_xor是對二進制數(shù)據(jù)進行“異或”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“異或”操作,1^1=0,1^0=1,0^1=1,0^0=0;

bitwise_not是對二進制數(shù)據(jù)進行“非”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“非”操作,~1=0,~0=1;

總結

以上是生活随笔為你收集整理的【opencv】17.提取RBG各种颜色c++代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。