?????????OpenCV 圖像重映射函數(shù)remap()對圖像應(yīng)用通用幾何變換。其原型如下:
? ? ? ? void remap(InputArray? src,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OutputArray?dst,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?InputArray? map1,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?InputArray map2,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int? ?interpolation,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int?borderMode?=?BORDER_CONSTANT,
????????????????????????????????const?Scalar?&?borderValue?=?Scalar()
? ? ? ? ? ?)
???參數(shù):
? ? ? ?
src?源圖像。
? ? ? ?dst?輸出目標
圖像。它的大小與 map1 相同,類型與 src 相同。
? ? ? ?
map1?
(x,y) 點或僅 x 值的第一個映射具有 CV_16SC2 、 CV_32FC1 或 CV_32FC2 ????????????????????????????????類型。
? ? ? ? ? ? ? ? ? ? map2??y 值的第二個映射分別具有 CV_16UC1、CV_32FC1 類型或無類型(如果映射 ????????1 是 (x,y) 點,則為空映射)。
? ? ? ? ? ? ? ? ? ? ? interpolation?插值方法,可選:? INTER_NEAREST,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?INTER_LINEAR ,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INTER_CUBIC,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??INTER_LANCZOS4,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????????????????????????????????????????????????????????????INTER_NEAREST_EXACT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INTER_MAX? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? WARP_FILL_OUTLIERS ,?????????????????????????????????????????????????????????????????????WARP_INVERSE_MAP?
????????????????????????borderMode?像素外推法。當 borderMode=BORDER_TRANSPARENT 時,意味? ? ? ? ? ? ? ? 著目標圖像中與源圖像中的“異常值”相對應(yīng)的像素不會被該函數(shù)修改??蔀椋築ORDER_CONSTANT ,BORDER_REPLICATE,BORDER_REFLECT,BORDER_WRAP ,BORDER_REFLECT_101 ,BORDER_TRANSPARENT ,BORDER_REFLECT101 ,BORDER_DEFAULT,BORDER_ISOLATED
????????????????????????borderValue?在邊界恒定的情況下使用的值。默認值為?0。
????????OpenCV的remap
函數(shù)的主要用途是重新映射圖像中像素的位置或值。用它可以實現(xiàn)圖像鏡像、形態(tài)改變、特效制作、圖像分割等。下面以例演示?其用法。先寫一個示例程序,讀入一張圖片然后,用remap函數(shù)分別獲取水平鏡像圖片,示例程序代碼如下:
// RemapTest.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("1.png");
if (src.empty())
{
cout << "Cann't load Image!";
return -1;
}
imshow("原始圖像:",src);
Mat srcx(src.rows, src.cols, CV_32F); // x 方向
Mat srcy(src.rows, src.cols, CV_32F); // y 方向
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = src.cols - j - 1;
srcy.at<float>(i, j) = i;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("水平鏡像:", src);
waitKey(0);
return 1;
}
試運行,結(jié)果如下:
? ? ? ?獲取垂直鏡像,其代碼如下:
// RemapTest.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("1.png");
if (src.empty())
{
cout << "Cann't load Image!";
return -1;
}
imshow("原始圖像:",src);
Mat srcx(src.rows, src.cols, CV_32F); // x 方向
Mat srcy(src.rows, src.cols, CV_32F); // y 方向
//水平鏡像
/*
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = src.cols - j - 1;
srcy.at<float>(i, j) = i;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("水平鏡像:", src);
*/
//垂直鏡像
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = j;
srcy.at<float>(i, j) = src.rows -i -1;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("垂直鏡像:", src);
waitKey(0);
return 1;
}
? ? ? ?試運行結(jié)果如下:
? 再寫一段改變圖形形狀的代碼,代碼如下:
// RemapTest.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("1.png");
if (src.empty())
{
cout << "Cann't load Image!";
return -1;
}
imshow("原始圖像:",src);
Mat srcx(src.rows, src.cols, CV_32F); // x 方向
Mat srcy(src.rows, src.cols, CV_32F); // y 方向
//水平鏡像
/*
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = src.cols - j - 1;
srcy.at<float>(i, j) = i;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("水平鏡像:", src);
*/
//垂直鏡像
/*
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = j;
srcy.at<float>(i, j) = src.rows -i -1;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("垂直鏡像:", src);
*/
//改變圖像形狀
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = j;
srcy.at<float>(i, j) = i + 5.0 * cos(i / 5.0);
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("改變圖形形狀:", src);
waitKey(0);
return 1;
}
? ? ? ?割裂效果呈現(xiàn),實現(xiàn)的程序代碼如下:
// RemapTest.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("1.png");
if (src.empty())
{
cout << "Cann't load Image!";
return -1;
}
imshow("原始圖像:",src);
Mat srcx(src.rows, src.cols, CV_32F); // x 方向
Mat srcy(src.rows, src.cols, CV_32F); // y 方向
//水平鏡像
/*
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = src.cols - j - 1;
srcy.at<float>(i, j) = i;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("水平鏡像:", src);
*/
//垂直鏡像
/*
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = j;
srcy.at<float>(i, j) = src.rows -i -1;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("垂直鏡像:", src);
*/
//改變圖像形狀
/*
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = j;
srcy.at<float>(i, j) = i + 5.0 * cos(i / 5.0);
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("改變圖形形狀:", src);
*/
//割裂效果呈現(xiàn)
for (size_t i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
srcx.at<float>(i, j) = j + 10.0 * tan(j / 5.0);;
srcy.at<float>(i, j) = i;
}
}
remap(src, src, srcx, srcy, INTER_LINEAR);
imshow("割裂效果:", src);
waitKey(0);
return 1;
}
?試運行,結(jié)果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-856545.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-856545.html
到了這里,關(guān)于OpenCV 圖像重映射函數(shù)remap()實例詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!