天天看點

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];
			}
		}
	}
	
}
           
Opencv3.x圖像融合