1. 程式人生 > >opencv重對映remap( )函式

opencv重對映remap( )函式



int main(int argc, char** argv)
{
 Mat srcImage, dstImage;
 Mat map_x, map_y;
 namedWindow("程式視窗");
 //載入原始圖 
 srcImage = imread("test.jpg", 1);
 //建立和原始圖一樣的效果圖,x重對映圖,y重對映圖
 dstImage.create(srcImage.size(), srcImage.type());
 map_x.create(srcImage.size(), CV_32FC1);
 map_y.create(srcImage.size(), CV_32FC1);
 //雙層迴圈,遍歷每一個畫素點,改變map_x & map_y的值 
 for (int j = 0; j < srcImage.rows; j++)
   {
       for (int i = 0; i < srcImage.cols; i++)
         {
           //改變map_x & map_y的值.  
        map_x.at<float>(j, i) = static_cast<float>(i);
           map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);
     /////////////////////////////////////////////////////////
     //map_x.at<float>(j, i) = static_cast<float>(srcImage.cols-i);
     // map_y.at<float>(j, i) = static_cast<float>(j);
     ///////////////////////////////////////////////////////
     //map_x.at<float>(j, i) = static_cast<float>(srcImage.cols-i);
     //map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);
     /////////////////////////////////////////////////////////
     //map_x.at<float>(j, i) = static_cast<float>(2*( i - srcImage.cols*0.25 ) + 0.5);
     //map_y.at<float>(j, i) = static_cast<float>(2*( j - srcImage.rows*0.25 ) + 0.5);
          }
     }
 //進行重對映操作
 remap(srcImage, dstImage, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
 imshow("程式視窗", dstImage);
 waitKey(30);
 return(0);
}

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,y)的第一個對映。
  • 表示CV_16SC2 , CV_32FC1 或CV_32FC2型別的X值。
    • 第四個引數,InputArray型別的map2,同樣,它也有兩種可能的表示物件,而且他是根據map1來確定表示那種物件。
  • 若map1表示點(x,y)時。這個引數不代表任何值。
  • 表示CV_16UC1 , CV_32FC1型別的Y值(第二個值)。
  • 第五個引數,int型別的interpolation,插值方式,之前的resize( )函式中有講到,需要注意,resize( )函式中提到的INTER_AREA插值方式在這裡是不支援的,所以可選的插值方式如下:
      • INTER_NEAREST - 最近鄰插值
      • INTER_LINEAR – 雙線性插值(預設值)
      • INTER_CUBIC – 雙三次樣條插值(逾4×4畫素鄰域內的雙三次插值)
      • INTER_LANCZOS4 -Lanczos插值(逾8×8畫素鄰域的Lanczos插值)
  • 第六個引數,int型別的borderMode,邊界模式,有預設值BORDER_CONSTANT,表示目標影象中“離群點(outliers)”的畫素值不會被此函式修改。
  • 第七個引數,const Scalar&型別的borderValue,當有常數邊界時使用的值,其有預設值Scalar( ),即預設值為0。