remap函数的使用问题




首先解释下remap()函数的作用及各参数的意义!

remap就是用来做重映射的,重映射的含义暂且不说,等会儿上源码并解释完源码后自然就知道了!

函数原型如下:

C++: void remap(InputArray src, OutputArraydst, InputArray map1, InputArray map2, int interpolation, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位或者浮点型图像。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放函数调用后的输出结果,需和源图片有一样的尺寸和类型。
第三个参数,InputArray类型的map1,里面存储着源图像中各像素点的x坐标在目标图像中的x坐标,x坐标就是代表列号
第四个参数,InputArray类型的map2,里面存储着源图像中各像素点的y坐标在目标图像中的y坐标,y坐标就是代表行号
第五个参数,int类型的interpolation,插值方式,可选的插值方式如下:
INTER_NEAREST - 最近邻插值
INTER_LINEAR – 双线性插值(默认值)
INTER_CUBIC – 双三次样条插值(逾4×4像素邻域内的双三次插值)
INTER_LANCZOS4 -Lanczos插值(逾8×8像素邻域的Lanczos插值)
第六个参数,int类型的borderMode,边界模式,有默认值BORDER_CONSTANT,表示目标图像中“离群点(outliers)”的像素值不会被此函数修改。具体什么叫离群点我现在也不清楚!
第七个参数,const Scalar&类型的borderValue,当有常数边界时使用的值,其有默认值Scalar( ),即默认值为0。具什么叫有常数边界,我现在也不清楚!//映射关系  (x, y) <-> (cols - x, y);

最重要的是需要搞清楚!!!!!!
 //数字图像的原点是在左上角,y轴竖直向下(行数),x轴水平向右(列数)
//下面的i定义的是行数,所以代表的是图像的y轴,而j定义的是列数,所以代表的是图像的x轴。


#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
 
 cv::Mat srcImage(2,3,CV_8UC1);
 srcImage.at<uchar>(0,0)=1;
    srcImage.at<uchar>(0,1)=2;
 srcImage.at<uchar>(0,2)=3;
 srcImage.at<uchar>(1,0)=128;
 srcImage.at<uchar>(1,1)=127;
 srcImage.at<uchar>(1,2)=126;
 int rows=srcImage.rows;
 int cols=srcImage.cols;
 cv::imshow("test",srcImage);
 std::cout<<srcImage<<std::endl;
 cv::Mat xmap(srcImage.size(),CV_32FC1);
 cv::Mat ymap(srcImage.size(),CV_32FC1);
 for(int j=0;j<rows;j++)
 {
  for(int i=0;i<cols;i++)
  {
   xmap.at<float>(j,i)=i;
   ymap.at<float>(j,i)=rows-1-j;
  }
 }
 cv::Mat result(srcImage.size(),srcImage.type());
 cv::remap(srcImage,result,xmap,ymap,CV_INTER_LINEAR,cv::BORDER_CONSTANT,cv::Scalar(0,0,0));
 cv::imshow("fanzhuan",result);
 std::cout<<result<<std::endl;
 cv::waitKey(0);
 return 0;
}
注意rows-1而不是rows,实际跑下代码可以看出因为从0开始的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值