阶段任务一
1、问题引入
如何实现让角色出现在背景上
2、简介
通过Mat像素访问的方法,使得两张图片重叠显示
3、知识点
Mat像素访问的方法的应用
1)、基本任务
实现两张图像的重叠显示
示例代码:
#include "iostream"
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main() {
// 读入一张图片
Mat img = imread("./img/map/map1.png");
Mat carImg = imread("./img/car/uupoop1.png");
// 创建一个名为 "img" 窗口
printf("%d %d %d %d", img.cols, img.rows ,img.channels(), img.depth());
int posX = 200;
int posY = 200;
for (int h = 0; h < carImg.rows; h++) {
for (int w = 0; w < carImg.cols ; w++) {
Vec3b & carPixel = carImg.at<Vec3b>(h, w);
uchar *ptr = img.ptr<uchar>(posX + h, posY + w);
ptr[0] = carPixel[0];
ptr[1] = carPixel[1];
ptr[2] = carPixel[2];
}
}
namedWindow("img");
// 在窗口中显示图片
imshow("img", img);
// 等待 6000 ms 后窗口自动关闭
waitKey(0);
destroyWindow("img");
img.release();
}
运行结果:
2)、扩展任务
实现两张图像的半透明交叠显示
运行结果:
阶段任务二
1、问题引入
如何实现角色在背景上的抠图显示;
2、简介
通过Mat像素访问的方法,使得两张图片透明显示;
3、知识点
Mat像素访问的方法的应用
注意:像素各个颜色值存放的位置顺序
1)、基本任务
实现游戏角色的抠图显示
示例代码:
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main() {
Mat img = imread("./img/map/map1.png");
Mat carImg = imread("./img/car/uupoop1.png");
// 创建一个名为 "img" 窗口
printf("%d %d %d %d", img.cols, img.rows, img.channels(), img.depth());
int posX = 200;
int posY = 200;
for (int h = 0; h < carImg.rows; h++) {
for (int w = 0; w < carImg.cols; w++) {
Vec3b & carPixel = carImg.at<Vec3b>(h, w);
uchar *ptr = img.ptr<uchar>(posX + h, posY + w);
if ((carPixel[0] == 0) && (carPixel[1] == 255) && (carPixel[2] == 0))
continue;
ptr[0] = carPixel[0];
ptr[1] = carPixel[1];
ptr[2] = carPixel[2];
}
}
namedWindow("img");
// 在窗口中显示图片
imshow("img", img);
// 等待 6000 ms 后窗口自动关闭
waitKey(0);
destroyWindow("img");
img.release();
}
运行结果:
2)、扩展任务
i、实现多角色图像的抠图显示
ii、抽象出透明贴图的函数