OpenCV小游戏-《跑跑卡丁车》项目实践-3

本文详细介绍使用OpenCV库中的Mat像素访问方法实现图像叠加与角色抠图的技术。包括基本的图像叠加显示,以及扩展到半透明交叠显示和角色抠图显示。通过示例代码展示了如何将一个角色图像放置在背景图像上,并实现角色图像的透明处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阶段任务一

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、抽象出透明贴图的函数
结果截图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值