opencv學習筆記7 重映射和仿射變換

一。重映射

void remap(InputArray src, OutputArraydst, InputArray map1, InputArray map2, int interpolation, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())ios

  • 第一個參數,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。
 1 #include<iostream>
 2 #include<vector>
 3 #include<opencv2/opencv.hpp>
 4 using namespace std;  5 using namespace cv;  6 int main()  7 {  8  Mat srcImage, dstImage;  9  Mat map_x, map_y; 10 
11     //【1】載入原始圖
12     srcImage = imread("E:/test.jpg", 1); 13     if (!srcImage.data) { printf("讀取圖片錯誤,請肯定目錄下是否有imread函數指定的圖片存在~! \n"); return false; } 14     imshow("原始圖", srcImage); 15 
16     //【2】建立和原始圖同樣的效果圖,x重映射圖,y重映射圖
17  dstImage.create(srcImage.size(), srcImage.type()); 18  map_x.create(srcImage.size(), CV_32FC1); 19  map_y.create(srcImage.size(), CV_32FC1); 20 
21     //【3】雙層循環,遍歷每個像素點,改變map_x & map_y的值
22     for (int j = 0; j < srcImage.rows; j++) 23  { 24         for (int i = 0; i < srcImage.cols; i++) 25  { 26             //改變map_x & map_y的值. 
27             map_x.at<float>(j, i) = static_cast<float>(srcImage.cols-i); //關於x軸對稱 28             map_y.at<float>(j, i) = static_cast<float>(j); //y軸不變 29  } 30  } 31 
32     //【4】進行重映射操做
33     remap(srcImage, dstImage, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0)); 34 
35     //【5】顯示效果圖
36     imshow("【程序窗口】", dstImage); 37  waitKey(); 38 
39     return 0; 40 }

 

 二。仿射變換

  • 旋轉,rotation (線性變換)
  • 平移,translation(向量加)
  • 縮放,scale(線性變換)

1.getAffineTransform(求平移矩陣)

Mat getAffineTransform( const Point2f src[], const Point2f dst[] );數組

 

參數1:Point2f類型的數組,源圖像的三個點位置函數

參數2:Point2f類型的數組,目標圖像的三個點位置ui

 經過指定3個點的偏移肯定圖像的變換矩陣。spa

2.getRotationMatrix2D(求旋轉、縮放矩陣)

Mat getRotationMatrix2D(Point2fcenter, double angle, double scale)code

3.warpAffine(進行仿射變換)

void warpAffine(InputArray src,OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())orm

 

 

 1 #include "opencv2/highgui/highgui.hpp"
 2 #include "opencv2/imgproc/imgproc.hpp"
 3 #include <iostream>
 4 
 5 using namespace cv;  6 using namespace std;  7 
 8 int main()  9 { 10 
11     Point2f srcTriangle[3];  //計算平移矩陣的三個點
12     Point2f dstTriangle[3]; 13 
14     Mat rotMat(2, 3, CV_32FC1); //旋轉矩陣
15     Mat warpMat(2, 3, CV_32FC1); //平移矩陣
16  Mat srcImage, dstImage_warp, dstImage_rotate; 17 
18     srcImage = imread("F:/opencv/lena.jpg", 1); 19 
23     srcTriangle[0] = Point2f(0, 0); //左上角點
24     srcTriangle[1] = Point2f(static_cast<float>(srcImage.cols - 1), 0); //右上角點
25     srcTriangle[2] = Point2f(0, static_cast<float>(srcImage.rows - 1)); //左下角點
26 
27     dstTriangle[0] = Point2f(static_cast<float>(srcImage.cols*0.0), static_cast<float>(srcImage.rows*0.3)); //對應變換的點
28     dstTriangle[1] = Point2f(static_cast<float>(srcImage.cols*0.5), static_cast<float>(srcImage.rows*0.5)); 29     dstTriangle[2] = Point2f(static_cast<float>(srcImage.cols*0.2), static_cast<float>(srcImage.rows*0.6)); 30     warpMat=getAffineTransform(srcTriangle, dstTriangle);  //計算平移矩陣
31     warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size()); //進行仿射變換
32 
33     Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2); //獲得旋轉中心點
34     double angle = -90;  //旋轉角度,+ 逆時針 -順時針
35     double scale = 0.5;  //縮放比例
36     rotMat = getRotationMatrix2D(center, angle, scale); //計算旋轉矩陣
37     warpAffine(srcImage, dstImage_rotate, rotMat, srcImage.size()); //進行仿射變換
38 
39     imshow("源圖像", srcImage); 40     imshow("平移變換的圖像", dstImage_warp); 41     imshow("旋轉,縮放的圖像", dstImage_rotate); 42     waitKey(0); 43 
44     return 0; 45 }

相關文章
相關標籤/搜索