OpenCV是一个基于C/C++语言的开源图像处理函数库;通过这个函数库,我们可以对图像进行一些处理;这些处理包括很多内容,而本篇文章只是讲述如何更换图像背景颜色;
----------------------------------------------------------------------------------------------------------------------------------
大家先看一张图片:
现在想要将黑色背景改为紫色,达到如下效果:
为了能实现背景更换,我们要考虑这几个问题:
1.在狭义的观点上,计算机只认识0和1,也就是说计算机只能处理字符和数字,现在怎么处理图片?
一个想法,就是map;我们要建立数字与图片的map;
也就是用矩阵来存储图片的像素点的值;
2.怎么知道这个像素点属于背景?
因为一种颜色的RGB是固定的,所以只要确定背影的颜色的RGB,根据这个标准来判断是否是背景,这里黑色的RGB为(1,1,1);(当然这里不考虑非背景中存在背景颜色)
由于背景的各个像素点的RGB可能存在稍微不同,所以判断的时候最好设置精度;
3.已经知道是背景颜色的像素点,怎么更换像素的RGB
1)怎么表示某一像素的RGB
CvScalar s;
2)怎么获取图片中的某一像素的RGB
s = cvGet2D(target, i, j); (target指的是图像指针, 而i, j指的是矩阵坐标)
3)更换
cvSet2D(target,i,j,s); (target指的是图像指针, 而i, j指的是矩阵坐标,s为RGB修改后)
注:这里要改为紫色 (即s = RGB(51,0,51))
4.使用openCV ,要加什么?
在代码里,要加下面的一段代码,即可使用openCV提供的函数
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
using namespace std;
#pragma comment (lib, "cv210.lib")
#pragma comment (lib, "cxcore210.lib")
#pragma comment (lib, "highgui210.lib")
具体的实现:
#define PRECISION 0.001
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
using namespace std;
#pragma comment (lib, "cv210.lib")
#pragma comment (lib, "cxcore210.lib")
#pragma comment (lib, "highgui210.lib")
// the condition to judge whehter to fix piexl
bool isNeedFix(double b, double g, double r);
// fix piexl to blue
void changePixelToBlue(double &b, double &g, double &r);
int main()
{
// IplImage指针,用来指向原始图像
IplImage *src = 0;
// 载入图像
if(src = cvLoadImage("1.jpg", -1)) // 成功,则修改图像背景;(-1表示读入的图像通道数与所读入的文件相同)
{
// 拷贝
IplImage* target = cvCreateImage(cvGetSize(src),
src->depth,
src->nChannels);// IplImage指针,用来指向处理过程中的图像
cvCopy(src, target, NULL); // 拷贝
// 像素点处理
CvScalar s;
for(int i = 0; i < target->height; i++)
{
for(int j = 0; j < target->width; j++)
{
s = cvGet2D(target, i, j); // to get the (i,j) pixel value
if(isNeedFix(s.val[0], s.val[1], s.val[2])) // to judge the pixel whether needs to fix
{
changePixelToBlue(s.val[0], s.val[1], s.val[2]); // fix pixel
cvSet2D(target,i,j,s); // to reset the (i,j) pixel value
}
}
}
// 保存图像
cvSaveImage("2.jpg", target);
cout << "处理结束!" << endl;
}
else
{
cout << "图片加载失败!" << endl;
}
system("pause");
return 0;
}
// the condition to judge whehter to fix piexl
bool isNeedFix(double b, double g, double r)
{
if(fabs(b-1)< PRECISION
&& fabs(g-1)< PRECISION
&& fabs(r-1)< PRECISION)
return true;
return false;
}
// fix piexl to blue
void changePixelToBlue(double &b, double &g, double &r)
{
b = 51;
g = 0;
r = 51;
}
需要注意的地方:
src = cvLoadImage("1.jpg", -1);
"-1"表示读入的图像通道数与所读入的文件相同;
“0”表示将读入的图像强制转化为一幅单通道灰度图像;
分享到:
相关推荐
例如,`cv2.imread("image.jpg")`可以读取名为"image.jpg"的图片,`cv2.imshow("Window", img)`会在名为"Window"的窗口中展示图像`img`。 2. **颜色空间转换**:OpenCV支持多种颜色空间转换,如从BGR到灰度、HSV等...
**OpenCV教程——基础篇(2)** OpenCV(开源计算机视觉库)是计算机视觉领域广泛应用的开源库,由Intel研发并维护,旨在提供一种高效、灵活的图像处理和计算机视觉算法实现。这本书《OpenCV教程基础篇》由刘瑞祯和于...
在图像处理领域,OpenCV(开源计算机视觉库)是一个强大的工具,它提供了丰富的函数和算法,...通过这样的技术,我们可以将原本单调的纯色背景图片转换为具有复杂背景的新图片,从而增加视觉吸引力和应用场景的多样性。
`video`模块用于视频分析,如运动估计、背景扣除和物体跟踪。`calib3d`处理多视图几何和3D重建问题,如相机标定和立体匹配。`features2d`和`objdetect`则涉及特征检测、描述符匹配和目标检测,例如人脸、眼睛或其他...
opencv机器视觉编程手册——中文版》,开发者可以全面了解和掌握opencv的使用方法,深入理解机器视觉的应用技术,以及掌握halcon与C#的联合开发技巧,从而能够在机器视觉、视频监控、双目视觉、机器学习、图片美化和...
本文将通过一个具体的示例——如何将一个带有白色背景的熊猫头部图像精确地叠加到另一张背景图片上,并去除白色背景,以达到更加逼真的效果,来详细介绍这一过程中的关键技术点。 #### 二、关键概念 在深入了解实现...
[Qt]图像处理小软件——给证件照换背景 之前看到码农大佬分享的文章,感觉是个小乐子,就自己动手做了个小软件,方便还没学会PS的小伙伴们临时换背景Hhhh~ 软件操作如GIF图所示: 新建Qt的项目文件~ .h中: #...
Part I 基础篇 OpenCV 开发基础. 1 第 1 章初识 OpenCV.. 3 1.1 OpenCV 初识 4 1.1.1 OpenCV 简介.....1.1.2 OpenCV 组件及架构....2——CMake 编译OpenCV3.1 源码. 372 3——OpenCV3.1 Extra 扩展库 375 参考文献.... 379
《OpenCV基础应用实例解析——sample_opencv》 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它包含了大量的图像处理和计算机视觉的算法,被广泛应用于图像识别、机器学习、图像分析等...
最后,OpenCV也提供了基于深度学习的模块——DNN(Deep Neural Network),可以直接加载预训练的深度学习模型,如AlexNet、VGG、ResNet等,进行图像分类、目标检测等任务。这使得开发者无需从头训练模型,就能利用...
EMCV,全称为Embedded OpenCV,是针对嵌入式平台优化的一个版本,旨在将流行的OpenCV(Open Source Computer Vision Library)库应用于资源受限的设备,如DSP(数字信号处理器)和ARM架构的微处理器。这一版本的...
**2.1 Mat——基本图像容器** - **Mat对象介绍:** - `cv::Mat`是OpenCV中最常用的数据结构之一。 - 存储图像和其他多维数组。 - 支持多种数据类型和维度。 **2.2 扫描图像、查找表和时间测量** - **图像扫描...
10. **第42讲:MFC显示图片及应用** - MFC(Microsoft Foundation Classes)是Windows编程的一个框架,本讲可能介绍如何结合OpenCV在MFC环境中显示和处理图像。 这些PDF文档构成了一个全面的OpenCV基础学习路径,从...
本教程“Learning OpenCV”和“OpenCV教程——基础篇”是针对OpenCV的学习资料,涵盖了从基本概念到实际应用的多个层次。 OpenCV主要由C++接口编写,同时也提供了Python、Java等语言的接口,方便不同背景的开发者...
标题提及的是OpenCV的第4个主要版本——OpenCV 4。这个版本不仅继承了OpenCV 3的功能,还引入了许多新特性和改进,以适应不断发展的计算机视觉研究和应用。 描述中提到的"opencv3的安装包"表明,虽然标题是OpenCV 4...
本文将深入探讨如何使用OpenCV C++进行颜色识别,同时结合提供的资源——一个名为"akaifi-MultiObjectTrackingBasedOnColor-777a150"的压缩包文件,我们可以看到一个基于颜色的多目标跟踪项目实例。 首先,颜色识别...
例如,游戏背景和角色图片可能需要经过预处理,以提高显示效果或减少计算复杂性。OpenCV提供了丰富的函数,如`cv::imread`用于读取图像,`cv::resize`用于调整图像大小,`cv::cvtColor`用于颜色空间转换,`cv::...
标题提到的是OpenCV的特定版本——2.3.1,这是一个在2012年发布的版本,尽管现在已经有更新的版本,但在某些特定的项目或环境中,旧版本可能因为兼容性或其他原因仍然是首选。 描述中提到,“有些工程可能会缺少...
[Qt]图像处理小软件——给证件照换背景 之前看到码农大佬分享的文章,感觉是个小乐子,就自己动手做了个小软件,方便还没学会PS的小伙伴们临时换背景Hhhh~ 软件操作如GIF图所示: 新建Qt的项目文件~ .h中: #...