Opencv3.x图像融合

实现坦克在地图上的跑动,虽然这只是一个小应用,但是涉及的东西确实不少,前期一直学opencv不过放了很长时间,帮同学重写这个东西,确实有点麻烦,本来很简单就能做的,硬是发了一个小时。

接着说说这个应用涉及的东西吧:

(1)图像的读取;

(2)图像感兴区域的获取;

(3)图像融合;

(4)图像的遍历;

把这些图像处理的过程连串起来确实不是什么难事。写下这篇博客记录一下,免得以后要用到这些类似的东西的时候又要到处找。

我使用的环境:VS2015+Opencv3.2;代码如下:

// 贴图3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include<opencv2/opencv.hpp>
using namespace cv;
RNG rng;
void RemoveBackground(Mat& src, Mat& dst);
void main()
{
	Mat tank = imread("tanke.png", 1);//tank pic
	Mat m_map = imread("map.jpg", 1);//map pic
	namedWindow("show pic move", CV_WINDOW_AUTOSIZE);//define windows to show pic
	size_t mapwidth = m_map.cols;
	size_t mapHeight = m_map.rows;
	size_t movewidth = m_map.cols - tank.cols;
	size_t moveheight = m_map.rows - tank.rows;
	while (1)
	{
		Mat tmap=m_map.clone();
		int x = rng.uniform(0, movewidth);
		int y = rng.uniform(0, moveheight);
		Mat imageroi;
		imageroi = tmap(Rect(x, y, tank.cols, tank.rows));
//		addWeighted(tank, 0.3, imageroi, 0.7, 0.0, imageroi);
		
		RemoveBackground(tank, imageroi);
	//	tank.copyTo(imageroi);
		imshow("show pic move", tmap);
		waitKey(1000);
	}
	waitKey(0);
	return;
}
void RemoveBackground(Mat& src, Mat& dst)
{
	int channels = src.channels();
	size_t width = src.cols * channels;
	size_t height = src.rows;
	for (size_t i = 0; i < height; i++)
	{
		uchar* sdata = src.ptr<uchar>(i);
		uchar* ddata = dst.ptr<uchar>(i);
		for (size_t j = 0; j < width; j+= channels)
		{
			if (sdata[j] < 180 && sdata[j+1] < 180 && sdata[j + 2] < 180)
			{
				ddata[j] = sdata[j];
				ddata[j+1] = sdata[j+1];
				ddata[j+2] = sdata[j+2];
			}
		}
	}
	
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用OpenCV进行图像拼接和融合的步骤: 1. 特征点提取:使用ORB和SURF等算法提取两张图片中的特征点。 2. 特征点匹配:使用OpenCV提供的特征点匹配算法,如FLANN或Brute-Force等,将两张图片中的特征点进行匹配。 3. 图像配准:通过计算匹配的特征点之间的变换矩阵,将两张图片进行配准,使它们在同一坐标系下对齐。 4. 图像拼接:将两张图片进行拼接,可以使用OpenCV提供的拼接函数,如cv2.stitcher或cv2.createStitcher等。 5. 图像融合:将拼接后的图像进行融合,可以使用OpenCV提供的图像融合函数,如cv2.addWeighted等。 以下是一个使用ORB算法进行图像拼接和融合的Python代码示例: ```python import cv2 # 读取两张图片 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 创建ORB特征点检测器 orb = cv2.ORB_create() # 在两张图片中分别检测特征点和描述符 kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) # 使用Brute-Force算法进行特征点匹配 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1, des2) # 将匹配的特征点按照距离进行排序 matches = sorted(matches, key=lambda x: x.distance) # 取前10个匹配的特征点 good_matches = matches[:10] # 获取匹配的特征点在两张图片中的坐标 src_pts = [kp1[m.queryIdx].pt for m in good_matches] dst_pts = [kp2[m.trainIdx].pt for m in good_matches] # 计算变换矩阵 M, mask = cv2.findHomography(np.float32(src_pts), np.float32(dst_pts), cv2.RANSAC, 5.0) # 将两张图片进行拼接 result = cv2.warpPerspective(img1, M, (img1.shape[1] + img2.shape[1], img1.shape[0])) result[0:img2.shape[0], 0:img2.shape[1]] = img2 # 将拼接后的图像进行融合 blend = cv2.addWeighted(result[:, :img1.shape[1]], 0.5, result[:, img1.shape[1]:], 0.5, 0) # 显示结果 cv2.imshow('Result', blend) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值