1. 程式人生 > >0003-OpenCV中重對映函式remap的使用,以影象在x和y方向的翻轉為例!

0003-OpenCV中重對映函式remap的使用,以影象在x和y方向的翻轉為例!

首先介紹一下remap函式
remap就是用來做重對映的,重對映的含義這裡先不講,大家看完這篇文章就知道了!

函式原型如下:
C++: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
引數src:輸入影象,即源影象。
引數dst:目標影象,需和源圖片有一樣的尺寸和型別。
引數map1:裡面儲存著源影象中各畫素點的x座標在目標影象中的x座標,x座標其實就是畫素點列號。
引數map2

:裡面儲存著源影象中各畫素點的y座標在目標影象中的y座標,y座標其實就是畫素點列號。
引數interpolation:插值方式,可選的插值方式如下:
    INTER_NEAREST - 最近鄰插值
    INTER_LINEAR – 雙線性插值(預設值)
    INTER_CUBIC – 雙三次樣條插值(4×4畫素鄰域內的雙三次插值)
    INTER_LANCZOS4 -Lanczos插值(8×8畫素鄰域的Lanczos插值)
引數borderMode:int型別:borderMode,邊界模式,有預設值BORDER_CONSTANT,表示目標影象中“離群點(outliers)”的畫素值不會被此函式修改,此時這些點的值由borderValue決定。離群點我猜應該是沒有被對映的點。
引數borderValue
:當引數borderMode設為BORDER_CONSTANT,其值決定了離群點的取值,有預設值,預設值為0。


程式碼流程如下
讀取源影象→利用remap函式做重沿x和y方向的翻轉操作→顯示源影象和翻轉後的影象

影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!

使用示例程式碼如下
原始碼中所需的圖片下載連結:http://pan.baidu.com/s/1i5mU66D 密碼:czyx

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

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

int main(){
        cv::Mat src = cv::imread("remap_pic.jpg");
        cv::Mat map_x_1, map_y_1, map_x_2, map_y_2, map_x_3, map_y_3;
        map_x_1.create(src.size(), CV_32FC1);
        map_y_1.create(src.size(), CV_32FC1);
        map_x_2.create(src.size(), CV_32FC1);
        map_y_2.create(src.size(), CV_32FC1);
        map_x_3.create(src.size(), CV_32FC1);
        map_y_3.create(src.size(), CV_32FC1);

        for (int iH = 0; iH<src.rows; iH++){
                for (int iW = 0; iW<src.cols; iW++){
                        map_x_1.at<float>(iH, iW) = iW;
                        map_y_1.at<float>(iH, iW) = src.rows - iH;

                        map_x_2.at<float>(iH, iW) = src.cols - iW;
                        map_y_2.at<float>(iH, iW) = iH;

                        map_x_3.at<float>(iH, iW) = src.cols - iW;
                        map_y_3.at<float>(iH, iW) = src.rows - iH;
                }
        }

        cv::Mat dst1, dst2, dst3;
        remap(src, dst1, map_x_1, map_y_1, CV_INTER_LINEAR);
        remap(src, dst2, map_x_2, map_y_2, CV_INTER_LINEAR);
        remap(src, dst3, map_x_3, map_y_3, CV_INTER_LINEAR);

        cv::imshow("origin", src);
        cv::imshow("remap_1", dst1);
        cv::imshow("remap_2", dst2);
        cv::imshow("remap_3", dst3);
        cv::waitKey(0);

        return 0;
}

執行結果如下圖所示