OpenCV--对接图像,对接对接对接

图像处理中有一种操作是“拼接图像”,直观解释就是“百度地图的街景图”。

最近做东西用到的不是“拼接”,而是“对接”,这个相对简单的多,但是一开始由于水平不够,还是费了不少劲,最后终于搞出来,这里做个备忘。

“对接”的目的是把几张图片平铺开来。

使用的是cv::Mat::copyTo(OutputArray m, InputArray mask) const,OpenCV3.4.0对copyTo()的解释如下:

cv::Mat::copyTo(OutputArray m, InputArray mask) const

/*This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Parameters
m       Destination matrix. If it does not have a proper size or type before the operation, it is reallocated.
mask	Operation mask of the same size as *this. Its non-zero elements indicate which matrix elements need to be copied. 
        The mask has to be of type CV_8U and can have 1 or multiple channels.*/

基本思路如下:

先构造一个足够大的空的“黑布”,在这个黑布上画好特定的“区域 X”(ROI),然后把要“对接”的图像x填充(copyTo)到对应的区域X上去。


代码如下:

bool procPics(cv::Mat&_m0, cv::Mat&_m1, cv::Mat&_m2, cv::Mat&_m3, cv::Mat&_matDst, int procMode) 
{
	try
	{
		//"目"字形对接
		if (0 == procMode)
		{
			_matDst = Mat::zeros(cv::Size(_m0.cols * 4, _m0.rows), _m0.type());
			Mat roiImg, mask;
			Rect rt0(0, 0, _m0.cols, _m0.rows)
				, rt1(_m0.cols, 0, _m1.cols, _m1.rows)
				, rt2(_m0.cols * 2, 0, _m2.cols, _m2.rows)
				, rt3(_m0.cols * 3, 0, _m3.cols, _m3.rows);
			mask = Mat::ones(cv::Size(_m0.cols, _m0.rows), CV_8U);

			roiImg = _matDst(rt0);
			_m0.copyTo(roiImg, mask);
			roiImg = _matDst(rt1);
			_m1.copyTo(roiImg, mask);
			roiImg = _matDst(rt2);
			_m2.copyTo(roiImg, mask);
			roiImg = _matDst(rt3);
			_m3.copyTo(roiImg, mask);
		}
		else if (1 == procMode)
		{
			//"田"字形对接
			//do something
		}
		else
			return false;
	}
	catch (const cv::Exception&)
	{
		return false;
	}
	return true;
}

效果图如下:






猜你喜欢

转载自blog.csdn.net/csdn_zhishui/article/details/79334701