opencv图像-拼接线的处理
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、边缘融合
两幅图像合并的地方是有清晰的界限的,如果取第一幅图像的全部,图像底部还会有黑边,因此,取图的时候注意去除最后一行或者最后一列。
上面这幅图的接线有一道像刀锋一样,下图则使用融合以后,接线处没有刀锋感了
算法如下:
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图像-拼接线的处理的主要内容,如果未能解决你的问题,请参考以下文章