C++ Opencv remap()重映射函數詳解及使用示例


一、重映射及remap()函數介紹

重映射,就是把一幅圖像中某位置的像素放置到另一圖像指定位置的過程。即:

在重映射過程中,圖像的大小也可以同時發生改變。此時像素與像素之間的關系就不是一一對應關系,因此在重映射過程中,可能會涉及到像素值的插值計算。

src:輸入圖像,灰度圖或真彩圖均可。

dst:輸出圖像,要求大小和xmap,ymap相同,通道數目及數據類型和src相同。

xmap:用於存放圖像X方向的映射關系,類型必須是CV_32FC1的。

ymap:用於存放圖像Y方向的映射關系,類型必須是CV_32FC1的。

interpolation:插值方式。

borderMode:圖像邊界處理方式,邊界的類型有以下幾種:

1)BORDER_REPLICATE:重復:                 aaaaaa|abcdefgh|hhhhhhh

2)BORDER_REFLECT:反射:                       fedcba|abcdefgh|hgfedcb

3)BORDER_REFLECT_101:反射101:         gfedcb|abcdefgh|gfedcba

4)BORDER_WRAP:外包裝:                      cdefgh|abcdefgh|abcdefg

5)BORDER_CONSTANT:常量復制:          iiiiii|abcdefgh|iiiiiii(i的值由后一個參數Scalar()確定,如Scalar::all(0) )

borderValue:若上一參數為BORDER_CONSTANT,則由此參數確定補充上去的像素值。可選用默認值。

二、程序及結果分享

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat mImage = imread("goalkeeper.jpg");
	if (mImage.data == 0)
	{
		cerr << "Image reading error !" << endl;
		system("pause");
		return -1;
	}
	namedWindow("The original image", WINDOW_NORMAL);
	imshow("The original image", mImage);

	Mat mResult = mImage.clone();
	//mMapX和mMapY的數據類型必須是 CV_32FC1
	Mat mMapX(mImage.rows, mImage.cols, CV_32FC1, Scalar(0));
	Mat mMapY(mImage.rows, mImage.cols, CV_32FC1, Scalar(0));
	int Rows = mImage.rows;
	int Cols = mImage.cols;

	for (int i = 0; i <Rows; i++)
	{
		float* ptrX = mMapX.ptr<float>(i);
		float* ptrY = mMapY.ptr<float>(i);
		for (int j = 0; j < Cols; j++)
		{
			//左右翻轉
			ptrX[j] =(float)(Cols - j);
			ptrY[j] = (float) i;
			//上下翻轉
			//ptrX[j] = (float)j;
			//ptrY[j] = (float)(Rows - i);
		}
	}

	remap(mImage, mResult, mMapX, mMapY, INTER_LINEAR);//重映射

	namedWindow("The processed image",WINDOW_NORMAL);
	imshow("The processed image", mResult);
	waitKey();
	destroyAllWindows();
	return 0;
}

學會重映射,以后門神就單張單張地買,終於可以省錢娶媳婦了,哈哈哈:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM