21xrx.com
2024-09-20 06:03:45 Friday
登录
文章检索 我的文章 写文章
如何用C++实现变色爱心?
2023-07-04 18:54:05 深夜i     --     --
C++ 变色爱心 实现

变色爱心是一种常见的图像效果,它往往被运用于电子贺卡、微信表情包等场合。如果你也希望学习如何用C++来实现变色爱心,不妨参考以下教程。

步骤一:准备工作

在开始编程之前,我们需要准备一些工作。首先,需要安装一个图像处理库——OpenCV。OpenCV是一个基于BSD许可证的开源库,可用于图像处理、计算机视觉和机器学习方面。它支持多种操作系统和编程语言,包括C++、Python、Java等。

安装OpenCV有许多不同的方法,你可以选择在官网上下载源代码自行编译,也可以使用现成的二进制包。对于Windows用户,可以使用Chocolatey等包管理器进行安装,也可以在Visual Studio中直接添加OpenCV库。具体安装方法可以参考OpenCV官网或者各种教程。

除了安装OpenCV之外,我们还需要一张爱心的图像。可以在网上找一张高清的爱心图片,也可以自己画一张。

步骤二:读取图片并转换为灰度图

在代码中读取图片并将其转换为灰度图,代码如下:

 c++

#include <opencv2/opencv.hpp>

using namespace cv;

int main()

{

  Mat img = imread("heart.png"); // 读取图片

  Mat grayImg;

  cvtColor(img, grayImg, COLOR_BGR2GRAY); // 转换为灰度图

  imshow("grayImg", grayImg); // 显示灰度图

  waitKey(0);

  return 0;

}

注:其中imread()函数用于读取图片,cvtColor()函数用于将图像转换为灰度图,imshow()函数用于显示图像,waitKey()函数用于等待按键输入。

步骤三:对灰度图进行二值化处理

在代码中对灰度图进行二值化处理,代码如下:

 c++

#include <opencv2/opencv.hpp>

using namespace cv;

int main()

{

  Mat img = imread("heart.png"); // 读取图片

  Mat grayImg, binaryImg;

  cvtColor(img, grayImg, COLOR_BGR2GRAY); // 转换为灰度图

  threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY); // 二值化处理

  imshow("binaryImg", binaryImg); // 显示二值化图

  waitKey(0);

  return 0;

}

注:其中threshold()函数用于进行二值化处理,第3个参数表示阈值,第4个参数表示最大值(一般为255),第5个参数表示阈值类型。

步骤四:对二值化图进行填充和轮廓提取

在代码中对二值化图进行填充和轮廓提取,代码如下:

 c++

#include <opencv2/opencv.hpp>

using namespace cv;

int main()

{

  Mat img = imread("heart.png"); // 读取图片

  Mat grayImg, binaryImg, filledImg;

  vector<vector<Point>> contours;

  vector<Vec4i> hierarchy;

  cvtColor(img, grayImg, COLOR_BGR2GRAY); // 转换为灰度图

  threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY); // 二值化处理

  // 填充空洞

  Mat fillImg = binaryImg.clone(); 

  floodFill(fillImg, Point(0, 0), Scalar(255)); 

  bitwise_not(fillImg, fillImg); 

  filledImg = (binaryImg | fillImg);

  // 提取轮廓

  findContours(filledImg, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

  // 显示轮廓图

  Mat contoursImg = Mat::zeros(img.size(), CV_8UC3);

  drawContours(contoursImg, contours, -1, Scalar(0, 0, 255), 2);

  imshow("contoursImg", contoursImg);

  waitKey(0);

  return 0;

}

注:其中floodFill()函数用于填充空洞,bitwise_not()函数用于取反图像,findContours()函数用于提取轮廓,drawContours()函数用于绘制轮廓。

步骤五:对轮廓进行变色处理

在代码中对轮廓进行变色处理,代码如下:

 c++

#include <opencv2/opencv.hpp>

using namespace cv;

int main()

{

  Mat img = imread("heart.png"); // 读取图片

  Mat grayImg, binaryImg, filledImg;

  vector<vector<Point>> contours;

  vector<Vec4i> hierarchy;

  cvtColor(img, grayImg, COLOR_BGR2GRAY); // 转换为灰度图

  threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY); // 二值化处理

  // 填充空洞

  Mat fillImg = binaryImg.clone(); 

  floodFill(fillImg, Point(0, 0), Scalar(255)); 

  bitwise_not(fillImg, fillImg); 

  filledImg = (binaryImg | fillImg);

  // 提取轮廓

  findContours(filledImg, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

  // 变色处理

  Mat colorImg = Mat::zeros(img.size(), CV_8UC3);

  RNG rng(12345);

  for (size_t i = 0; i < contours.size(); i++)

  {

    Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));

    drawContours(colorImg, contours, i, color, 2);

  }

  imshow("colorImg", colorImg);

  waitKey(0);

  return 0;

}

注:其中RNG()函数用于生成随机颜色,drawContours()函数用于绘制彩色轮廓。

以上就是用C++实现变色爱心的基本步骤,希望能对你有所帮助。当然,这只是实现的一个简单版本,你还可以根据自己的需求进行优化和扩展。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复