remap函数的使用问题

    xiaoxiao2021-03-25  64

    

    首先解释下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开始的

    转载请注明原文地址: https://ju.6miu.com/read-36428.html

    最新回复(0)