介绍
本篇文章给大家分享的是有关怎么在c++中使用opencv把蓝底照片转化为白底照片,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
具体如下:
# include & lt; opencv2/opencv.hpp> # include & lt; opencv2/核心/core.hpp> # include & lt; opencv2/highgui/highgui.hpp> # include & lt; opencv2/imgproc/imgproc.hpp> using namespace 性传播疾病; using namespace 简历;//包含简历命名空间 int main () { ,char *起源=癘riginal"; ,char *窗口=癐mage"; ,char * str=癎: \ \ yay.jpg"; ,namedWindow(起源、1); ,namedWindow(窗口,1); ,Mat 图像=imread (str); ,如果(! image.data) ,{ cout<才能;& lt;“图像载入出现问题“& lt; & lt; endl; return 才能;0; ,} ,Mat 投资回报率=图像(矩形(20、20、20、20)); ,Mat hsvImg; ,cvtColor (hsvImg,形象,还以为;CV_BGR2HSV);,//将图像转换到HSV颜色空间 ,//分离HSV空间,v[0]为H色调,v[1]为年代饱和度,v[2]为灰度 ,vectorv; ,分裂(hsvImg, v); ,Mat roiH=v[0](矩形(20、20、20、20)); ,Mat roi=v[1](矩形(20、20、20、20)); ,int SumH=0; ,int 金额=0; ,int avgH, avg;//蓝底的平均色调和平均饱和度 ,//取一块蓝色背景,计算出它的平均色调和平均饱和度 ,(int i=0;, i<20;,我+ +) ,{ 的才能(int j=0;, j<20;, j + +) {才能 ,,/* SumH=SumH + roiH (i, j); */,,SumH=int (roiH.at (j,我))+ SumH; ,,金额=int (roiS.at (j,我))+总结; ,,} ,} ,avgH=SumH/400; ,avg=金额/400; ,//遍历整个图像 问,int =hsvImg.rows; ,int 数控=hsvImg.cols; ,int =10步; ,(int j=0;, j<问;,j + +) ,{ 的才能(int i=0, i<数控;,我+ +) {才能 ,,//以h两个通道做阈值分割,把蓝色替换成红色 ,,如果((v [0] .at (我)j) & lt;=(avgH + 5),,,, v [0] .at (j, i)在=(avgH-5) ,,,,,(v [1] .at (我)j) & lt;=(avg + 40),,,, v [1] .at (j,我)祝辞=(avgS-40)) ,,{ ,,,//cout<& lt; int (v [0] .at (我)j) & lt; & lt; endl; ,,,//红色底 ,,,//v [0] .at (j, i)=0; ,,,//白色底 ,,,v [0] .at (j, i)=0; ,,,v [1] .at (j,我)=0,,//v[0]和[1]全调成0就是变成白色 ,,,//绿色底 ,,,//v [0] .at (j, i)=60; ,,,//蓝色底 ,,,//v [0] .at (j, i)=120; ,,,/* cout<& lt; int (v [0] .at (我)j) & lt; & lt; endl; */,,} ,,} ,} ,Mat finImg; ,合并(v, finImg); ,Mat rgbImg; ,cvtColor (finImg rgbImg, CV_HSV2BGR);,//将图像转换回RGB空间 ,imshow(起源、图像); ,imshow(窗口,rgbImg); ,//加个滤波把边缘部分的值滤掉(此处应该用低通滤波器,但感觉不太好,还是不用了)。 ,Mat 结果; ,高斯模糊(rgbImg,结果,大小(3、3),0.5); ,imshow(窗口,结果); ,imwrite (“new.jpg",结果); ,waitKey (0); ,//系统(“pause"); ,return 0; }
以上就是怎么在c++中使用opencv把蓝底照片转化为白底照片,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。