程序可以实现蓝色底片变为红色底片(但有点小bug)
修改自:opencv:HSV颜色模型_opencv hsv_君浪的博客-CSDN博客
相关文章:OpenCV Mat数据类型指针ptr的使用_cv::mat ptr_AoboSir的博客-CSDN博客
【OpenCV】HSV颜色识别-HSV基本颜色分量范围_hsv opencv范围_Taily老段的博客-CSDN博客
OpenCV 中的split函数和merge函数 及示例_opencv split_zqx951102的博客-CSDN博客
#include <QApplication>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#include <QDebug>
using namespace cv;
using namespace std;
void hsv_test(string fname){
Mat img = imread(fname);
resize(img,img,Size(300,500),0,0,INTER_AREA);//调整图片大小
/*resize(InputArray src, OutputArray dst, Size dsize,
double fx=0, double fy=0, int interpolation=INTER_LINEAR )
INTER_AREA:一种插值的方式
fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;
fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;
参考:https://blog.csdn.net/xidaoliang/article/details/86504720
*/
imshow("src", img);
cvtColor(img,img,COLOR_BGR2HSV);//BGR--->HSV
vector<Mat> channels;
split(img,channels);
for (int i = 0; i < img.rows; i++){
//每一行
//分离出3个通道,channels[0]代表h
unsigned char* data = channels[0].ptr<unsigned char>(i);
//每一行第一个元素的指针
//unsigned char:8bit
for (int j = 0; j < img.cols; j++){//每一个
int temp = data[j];
//h的范围:0---180
//蓝色的h值范围在:100---124
//红色的h值范围在156---180
//这句是蓝色变红色:
if(temp<=124 && temp>=100)temp = 180;
//红色的h值范围在156---180
//绿色的h值范围在35---77
//这句是红色变绿色
if(temp>=156 && temp<=180)temp=77;
data[j] = temp;
}
}
Mat result;
merge(channels, result);
cvtColor(result, result, COLOR_HSV2BGR);//HSV--->BGR
imshow("result", result);
waitKey();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
string path="D:\\Qt\\Qt5Book\\Qt5.14\\opencv\\try1\\widget\\5.png";
hsv_test(path);
return a.exec();
}
通过修改相关参数可以比较方便地实现改变图片的颜色。