使用OpenCV做个简单的颜色提取器

学更好的别人,

做更好的自己。

——《微卡智享》

995e3b7806e1cb61ff1f57295d8de8e4.jpeg

本文长度为1035,预计阅读4分钟

前言

做UI界面时,常常会遇到配色的问题,有专业美工还好,没有的话,你想要什么颜色,需要自己进行提取,如果没有PS,那我们就用OpenCV做个简单的颜色提取功能。

69f86a3771d09a4b7364f85f4e43bab3.png

实现效果

04c5dc83fa19c618e1f4a0fb20bb3f6e.png


15e0518562ebcaa8da8bdc54c5b51b7a.jpeg

607f86d9674651a9c1609bc1da8c201f.jpeg

实现OpenCV获取颜色提取需要什么?

A

从上面的GIF动图中可以看出来,每点击图像中的位置直接显示出当前的RGB色和转换为16进制的字符。实现这个方式最主要的就考虑几点:

  1. 鼠标点击事件,获取当前位置

  2. 获取当前点的R、G、B的值

  3. 如果从RGB的值中转换为16进制

代码实现

73c3bf679c8ef4edfd2337252f28e7b6.png

微卡智享

#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include "../../Utils/CvUtils.h"


using namespace std;
using namespace cv;


Mat src;
Mat srccopy; //用于拷贝出的源图像
string showsrc = "图像";


//鼠标回调函数
void onMouse(int event, int x, int y, int flags, void* ustc); 


//RGB颜色转换为HEX
string rgb2hex(int r, int g, int b, bool ishead = false);




int main(int argc, char** argv) {


  src = imread("E:/DCIM/6.jpg");
  CvUtils::MatResize(src);
  CvUtils::SetShowWindow(src, showsrc, 500, 20);
  imshow(showsrc, src);


  //设置鼠标响影事件
  setMouseCallback(showsrc, onMouse);




  waitKey(0);
  return 0;


}




void onMouse(int event, int x, int y, int flags, void* ustc)
{
  //鼠标左键按下
  if (event == EVENT_LBUTTONUP)
  {
    srccopy = src.clone();


    //获取点击位置的颜色,此处注意y和x的位置顺序
    Scalar color = srccopy.at<Vec3b>(y, x);
    int b = color[0];
    int g = color[1];
    int r = color[2];




    string hexstr = rgb2hex(r, g, b, true);


    string rgbtext = "RGB(" + to_string(r) + "," + to_string(g) + "," + to_string(b) + ")";
    string hextext = "HEX:" + hexstr;




    //在图像上画出点击位置
    circle(srccopy, Point(x, y), 2, Scalar(0, 255, 255));


    //输出显示文字
    putText(srccopy, rgbtext, Point(x + 5, y + 5), 1, 1.2, Scalar(0, 255, 255));
    putText(srccopy, hextext, Point(x + 5, y + 35), 1, 1.2, Scalar(0, 255, 255));


    imshow(showsrc, srccopy);
  }
}


string rgb2hex(int r, int g, int b, bool ishead)
{
  stringstream hexstr;
  if (ishead) hexstr << "#";
  hexstr << hex << (r << 16 | g << 8 | b);


  cout << "rgb:" << r << "," << g << "," << b << "  hex:" << hexstr.str() << endl;
  return hexstr.str();
}

微卡智享

划重点

b4fb4b60875d5eaa16e40143937cc82e.png

在鼠标事件中获取图像当前点颜色时,一定要记录第一个参数是y,第二个参数是x,在OpenCV中参数一般说是row和col的概念,row是行代表是y轴,col是列代表是x轴。

c489b0b7da6eee0ef63a7408ec7bb55f.png

代码中CvUtils的图片调整大小的显示位置,在当时写的CvUtils中实现,整个小Demo也是在我的OpenCVDemoCPP中,可以直接下载那个源码,里面还有别的Demo练习。

0657368dab63431715070f33867bd4d1.png

从RGB转Hex直接在C++中std::hex中实现即可,比较简单。这样一个OpenCV的颜色提取小Demo就完成了。

aae0e154d0ddba5af119183d2281587b.png

3acfa1bf138ccf49ca678d9018d6425b.png

源码地址

https://github.com/Vaccae/OpenCVDemoCpp.git

点击阅读原文可以看到“码云”的代码地址

38305650200da0ca9597f17f8b3f001e.png

beac962ebd14bd8a75aedb83b5114ba4.png

往期精彩回顾

91b72ec752bb445f1ef230f797b49bf1.jpeg

Android前台服务的使用(二)--使用LiveEventBus实现进程间通讯(附源码)


8f2c3bba66e166733a054cd492659651.jpeg

Android前台服务的使用(一)


83936e5708fc15ec551080a1a258cef0.jpeg

OpenCV实现图片批号效期提取


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值