C++双线性插值-片段

代码不能直接使用。

	for (int j = strRY; j<endRY; ++j)
	{
		float * pR = result.ptr<float>(j);

		for (int i = strRX; i < endRX; ++i)
		{
			// To make sure z value;
			float z(FLOAT32_MIN);
			int i_(i - pOffset.x), j_(j - pOffset.y);

			float x = m_mapX.at<float>(j - strRY, i - strRY);
			float y = m_mapY.at<float>(j - strRY, i - strRY);

			// whether out of range.
			if (x < 0 || x >= src2.cols || y < 0 || y >= src2.rows)
				continue;

			int lRow = static_cast<int>(y);
			int nRow = lRow + 1;

			int lCol = static_cast<int>(x);
			int nCol = lCol + 1;

			double u = y - lRow;
			double v = x - lCol;

			// interpolation
			// right bottom.
			if (lRow >= src2.rows - 1 && lCol >= src2.cols - 1)
			{
				float data = m_mapZ.at<float>(lRow, lCol);
				if (data == -1.0e6)
					continue;

				z = (1 - u) * (1 - v) *	data;
			}
			else if (lRow >= src2.rows - 1)//last row
			{
				float data = m_mapZ.at<float>(lRow, lCol);
				float data2 = m_mapZ.at<float>(lRow, nCol);
				if (data == -1.0e6 || data2 == -1.0e6)
					continue;

				z = (1 - u) * (1 - v) *	data +
					(1 - u) * v * data2;
			}
			else if (lCol >= src2.cols - 1)//last col
			{
				float data = m_mapZ.at<float>(lRow, lCol);
				float data3 = m_mapZ.at<float>(nRow, lCol);

				if (data == -1.0e6 || data3 == -1.0e6)
					continue;
				z = (1 - u) * (1 - v) *	data + u * (1 - v) * data3;
			}
			else
			{
				float data = m_mapZ.at<float>(lRow, lCol);
				float data2 = m_mapZ.at<float>(lRow, nCol);
				float data3 = m_mapZ.at<float>(nRow, lCol);
				float data4 = m_mapZ.at<float>(nRow, nCol);
				if (data == -1.0e6 || data2 == -1.0e6 || data3 == -1.0e6 || data4 == -1.0e6)
					continue;

				z = (1 - u) * (1 - v) *	data + (1 - u) * v * data2 +
					u * (1 - v) * data3 + u * v * data4;
			}

			pR[i] = pR[i] == -1.0e6 ? z : 0.5*(pR[i] + z);

		}
	}

  

 

转载于:https://www.cnblogs.com/alexYuin/p/9614133.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值