opencv图像-拼接线的处理

opencv 基础函数

opencv 拼接两副图像是很好处理的,如左右拼接, 使用colRange,上下拼接,使用rowRange,这两个函数在opencv里封装的比较好,注意是左闭右边开的函数。

1 rowRange colRange

inline Mat Mat::rowRange(int startrow, int endrow) const
{
     
    return Mat(*this, Range(startrow, endrow), Range::all());
}
inline Mat Mat::colRange(int startcol, int endcol) const
{
     
    return Mat(*this, Range::all(), Range(startcol, endcol));
}

statrol 和endcol 分别是开始和结束的列,startrow和endrow是开始和结束的列,注意是左闭右边开,也就是包含开始但是不包含结束。

2、创建和合并

创建一个图像,h_out,w_out 是新图像的大小

    Mat FeatureMat = Mat::zeros(
		h_out,
		w_out,
		s1.type());
	//映射图像
	Mat tmpMat1 = FeatureMat.rowRange(0, h1);
	Mat tmpMat2 = FeatureMat.rowRange(h1, h_out);
   //需要拷贝的图1
	tmp1.copyTo(tmpMat1);
	//需要拷贝的图2
	tmp2.copyTo(tmpMat2);

3、边缘融合

两幅图像合并的地方是有清晰的界限的,如果取第一幅图像的全部,图像底部还会有黑边,因此,取图的时候注意去除最后一行或者最后一列。
opencv图像-拼接线的处理_第1张图片
上面这幅图的接线有一道像刀锋一样,下图则使用融合以后,接线处没有刀锋感了
opencv图像-拼接线的处理_第2张图片
算法如下:

int y = h1 - 1; //拼接的最后一行
	for (int i = 0; i < w_out; ++i) {
     
		cv::Vec3b a1 = FeatureMat.at<cv::Vec3b>(y, i);
		cv::Vec3b a2 = FeatureMat.at<cv::Vec3b>(y+1,i);
		cv::Vec3b a3 = FeatureMat.at<cv::Vec3b>(y+2, i);

		FeatureMat.at<cv::Vec3b>(y, i) = a1 * 0.6 + a2 * 0.4;
		FeatureMat.at<cv::Vec3b>(y+1, i) = a1 * 0.4 + a2 * 0.6;
		FeatureMat.at<cv::Vec3b>(y+2, i) = a1 * 0.3 + a2 * 0.3 + a3 *0.4;
	}

原理是取三行像素做融合计算。由于摄像头的角度问题,上下对齐都还需要很多算法来计算,这是第一步,请等待下文。

你可能感兴趣的:(opencv和AI,opencv,c++,融合算法)