opencv_ex22-圖像放大pyrUp、創建空白Mat資料空間zerors、創建空白Mat資料空間create、幾何變換remap
opencv_ex22-圖像放大pyrUp、創建空白Mat資料空間zerors、創建空白Mat資料空間create、幾何變換remap
GITHUB: https://github.com/jash-git/CPP_opencv249_ex
OpenCV重映射
void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
src:輸入圖。
dst:輸出圖,型態和輸入圖相同。
map1:第一個輸入的映射表,型態可為CV_16SC2、CV_32FC1或CV_32FC2,尺寸和輸入圖相同,映射表的值代表的是輸入圖此像素位置要轉移去的新x座標。
map2:第二個輸入的映射表,型態可為CV_16UC1或 CV_32FC1,尺寸和輸入圖相同,映射表的值代表的是輸入圖此像素位置要轉移去的新y座標。。
interpolation:內插型態。
borderMode:邊界模式,預設為BORDER_CONSTANT。
borderValue:邊界外推值,預設強度為0。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/ml/ml.hpp> #include <iostream> #include <cstdio> #include <sys/timeb.h> #if defined(WIN32) #define TIMEB _timeb #define ftime _ftime typedef __int64 TIME_T; #else #define TIMEB timeb typedef long long TIME_T; #endif using namespace cv; using namespace std; Mat src;//input image Mat dst, map_x, map_y; int index = 0; void update_map(void); void Pause() { printf("Press Enter key to continue..."); fgetc(stdin); } int main() { const char* OUTPUT_TITLE = "remap demo"; Mat input; input = imread("Lena_original.jpg"); if (!input.data) { printf("could not load image...\n"); } else { //放大 pyrUp(input, src, Size(input.cols*2, input.rows*2)); namedWindow("Lena_original", CV_WINDOW_AUTOSIZE); imshow("Lena_original", src); namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE); map_x.create(src.size(), CV_32FC1); map_y.create(src.size(), CV_32FC1); dst=Mat::zeros(src.size(),src.type()); int c = 0; while (true) { c = waitKey(500); if ((char)c == 27) {//ESC break; } index = c % 4; printf("%d -> %d\n",c,index); update_map(); /* 幾何變換(remap) OpenCV重映射 void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar()) src:輸入圖。 dst:輸出圖,型態和輸入圖相同。 map1:第一個輸入的映射表,型態可為CV_16SC2、CV_32FC1或CV_32FC2,尺寸和輸入圖相同,映射表的值代表的是輸入圖此像素位置要轉移去的新x座標。 map2:第二個輸入的映射表,型態可為CV_16UC1或 CV_32FC1,尺寸和輸入圖相同,映射表的值代表的是輸入圖此像素位置要轉移去的新y座標。。 interpolation:內插型態。 borderMode:邊界模式,預設為BORDER_CONSTANT。 borderValue:邊界外推值,預設強度為0。 */ remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255)); imshow(OUTPUT_TITLE, dst); } } waitKey(0); Pause(); return 0; } void update_map(void) { for (int row = 0; row < src.rows; row++) {//高度 X for (int col = 0; col < src.cols; col++) {//寬度 Y switch (index) { case 0://縮小一半 if (col > (src.cols * 0.25) && col <= (src.cols*0.75) && row > (src.rows*0.25) && row <= (src.rows*0.75)) { map_x.at<float>(row, col) = 2 * (col - (src.cols*0.25)); map_y.at<float>(row, col) = 2 * (row - (src.rows*0.25)); } else { map_x.at<float>(row, col) = 0; map_y.at<float>(row, col) = 0; } break; case 1://X反轉 map_x.at<float>(row, col) = (src.cols - col - 1); map_y.at<float>(row, col) = row; break; case 2://Y反轉 map_x.at<float>(row, col) = col; map_y.at<float>(row, col) = (src.rows - row - 1); break; case 3://XY反轉 map_x.at<float>(row, col) = (src.cols - col - 1); map_y.at<float>(row, col) = (src.rows - row - 1); break; } } } }