#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/video.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc, const char** argv)
{
// 加载图像到内存
Mat myImg = imread("/home/oceanstar/桌面/1.jpg");
// 判断图像是否存在
if (myImg.empty())
{
cout << "could not find image..." << endl;
return -1;
}
Mat hsvImg;
Mat outputhsvImg;
// 将RGB图像myImg转化为HSV图像hsvImg
cvtColor(myImg, hsvImg, COLOR_BGR2HSV);
// 定义一个与hsvImg图像一样大小的像素值都是(255,255,255,)的空白图像outputhsvImg,用于实时显示,可忽略
outputhsvImg = Mat(hsvImg.rows, hsvImg.cols, CV_8UC3, cv::Scalar(255, 255, 255));
// 显示原图
imshow("origin", myImg);
waitKey(1);
double H = 0.0, S = 0.0, V = 0.0;
// 建立输出文件流
ofstream ofile;
ofile.open("3_jpg.txt");
ofile << "图像3.jpg每一像素的HSV值:" << endl;
ofile << "序号\t坐标\tH\tS\tV" << endl;
for (int i = 0; i < hsvImg.rows; i++)
{
for (int j = 0; j < hsvImg.cols; j++)
{
// 读取每一点HSV值,存在H,S,V变量中。
H = hsvImg.at<Vec3b>(i, j)[0];
S = hsvImg.at<Vec3b>(i, j)[1];
V = hsvImg.at<Vec3b>(i, j)[2];
// 将当前H,S,V值更新到空白图像中,用于显示,便于观察
outputhsvImg.at<Vec3b>(i, j)[0] = H;
outputhsvImg.at<Vec3b>(i, j)[1] = S;
outputhsvImg.at<Vec3b>(i, j)[2] = V;
// 显示新的实时图像
imshow("outputhsvImage", outputhsvImg);
char key = (char)waitKey(1);
if (key == 27)
return 0;
// 输出当前像素点坐标及对应H,S,V值。
cout << "第" << i*hsvImg.rows + j << "个像素点(" << i << "," << j << ")的HSV值为:"
<< " H: " << H << " S: " << S << " V: " << V<<endl;
// 将图片的HSV值写入文件
ofile << i*hsvImg.rows + j <<"\t"<<"(" <<i<<","<<j <<")"<<"\t"<< H <<"\t"
<< S << "\t"<< V << endl;
}
}
//关闭文件流
ofile.close();
return 0;
}
如果想得到RGB值,只需删除转换函数cvtColor()即可。
#include //头文件
#include
#include
#include
#include
using namespace cv; //包含cv命名空间
using namespace std;
void avg_hsv(const Mat& imagePart, int *meanH, int *meanS, int *meanV){
Mat hsvImage;
cvtColor(imagePart, hsvImage, COLOR_BGR2HSV); //将RGB转成HSV
int rowNumber = hsvImage.rows; //行数
int colNumber = hsvImage.cols; //列数
CvPoint pointVal;
int hValues = 0,sValues = 0,vValues = 0;
for(int i = 0; i < rowNumber; i++) //行循环,可根据需要换成rowNumber
{
for(int j = 0; j < colNumber; j++) //列循环,同理
{
pointVal.x=j;
pointVal.y=i;
hValues += static_cast<int>(hsvImage.at<Vec3b>(Point(pointVal))[0]); //H通道灰度值
sValues += static_cast<int>(hsvImage.at<Vec3b>(Point(pointVal))[1]); //S通道灰度值
vValues += static_cast<int>(hsvImage.at<Vec3b>(Point(pointVal))[2]); //V通道灰度值
}
}
*meanH=hValues/(rowNumber*colNumber); //区域图像的平均H值
*meanS=sValues/(rowNumber*colNumber); //区域图像的平均S值
*meanV=vValues/(rowNumber*colNumber); //区域图像的平均V值
}
int main()
{
// 【1】读入一张图片
Mat srcImage = imread("/home/oceanstar/workspace/cpp/a.png"),dstImage,imagePart,hsvImage;
resize(srcImage, srcImage, Size(srcImage.cols / 2, srcImage.rows / 2), 0, 0, INTER_LINEAR_EXACT);
dstImage = srcImage.clone();
while(true){
Rect rect;
rect=selectROI("aaaa", srcImage);
imagePart=srcImage(rect);//抠图
int meanH = 0, meanS = 0, meanV = 0;
avg_hsv(imagePart, &meanH, &meanS, &meanV);
std::cout << meanH << ";" << meanS << "; " << meanV << "\n";
if ((meanH >= 0 && meanH <= 180) && (meanS>= 0 && meanS <= 255) && (meanV >= 0 && meanV <= 46)){
cout << "黑" << endl;
}else if ((meanH >= 0 && meanH <= 180) && (meanS >= 0 && meanS <= 43) && (meanV >= 46 && meanV <= 220)){
cout << "灰" << endl;
}else if ((meanH >= 0 && meanH <= 180) && (meanS >= 0 && meanS <= 30) && (meanV >= 221 && meanV <= 255)){
cout << "白" << endl;
}else if (((meanH >= 0 && meanH <= 10) || (meanH >= 156 && meanH <= 180)) && (meanV >= 43 && meanV <= 255) && (meanV >= 46 && meanV <= 255)){
cout << "红" << endl;
}else if ((meanH >= 11 && meanH <= 25) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
cout << "橙" << endl;
}else if ((meanH >= 26 && meanH <= 34) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
cout << "黄" << endl;
}else if ((meanH >= 35 && meanH <= 77) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
cout << "绿" << endl;
}else if ((meanH >= 78 && meanH <= 99) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
cout << "青" << endl;
}else if ((meanH >= 100 && meanH <= 124) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 &&meanV <= 255)){
cout << "蓝" << endl;
}else if ((meanH >= 125 && meanH <= 155) && (meanS >= 43 && meanS <= 255) && (meanV >= 46 && meanV <= 255)){
cout << "紫" << endl;
}else{
cout << "未知" << endl;
}
//cvtColor(srcImage,dstImage,CV_BGR2GRAY);
// 【2】在窗口中显示载入的图片
// imshow("效果图",dstImage);
// 【3】等待按任意键窗口自动关闭
waitKey(0);
}
return 0;
}