OpenCV學習記錄22

一 學習內容

1 圖像映射

1.1 圖像映射---映射到不同的座標位置(例如:圖像上下對稱、左右對稱、對角線對稱、縮小等)

1.2 關於映射表的設置:值爲映射後的座標位置

二 代碼調試

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

Mat src,map_x, map_y,dst_remap;
char Figure1[] = "Figure1";
char Figure2_remap[] = "Figure2_remap";
char Figure3_remap[] = "Figure3_remap";
char Figure4_remap[] = "Figure4_remap";
char Figure5_remap[] = "Figure5_remap";
char Figure6_remap[] = "Figure6_remap";

void ZL_remap(void);
int index = 0;//設置索引,用於獲得不同條件下的映射表
int main() {
	//Mat src;
	src = imread("e:/2 opencv_projects_zl/Hua5.jpg");
	if (!src.data) {
		printf("Load Error...\n");
		return -1;
	}
	namedWindow(Figure1,CV_WINDOW_AUTOSIZE);
	imshow(Figure1,src);

	//學習新內容:圖像映射---映射到不同的座標位置(例如:圖像上下對稱、左右對稱、對角線對稱、縮小等)
	//1. 設置映射表
	map_x.create(src.size(),CV_32FC1);//x座標映射表,值爲映射後的座標位置
	map_y.create(src.size(), CV_32FC1);//y座標映射表,值爲映射後的座標位置
	//2. 調用函數:根據設置的映射表,完成圖像映射
	int c = 0;//鍵盤輸入
	namedWindow(Figure2_remap, CV_WINDOW_AUTOSIZE);
	while (true) {
		c = waitKey(500);
		if ((char) c == 27) {
			break;
		}
		index = c % 4;
		ZL_remap();
		remap(src, dst_remap,map_x,map_y,INTER_LINEAR,BORDER_CONSTANT,Scalar(100,100,200));
		imshow(Figure2_remap, dst_remap);
	}

	//waitKey(0);
	return 0;
}
void ZL_remap(void) {
	for (int row = 0; row < src.rows; row++)
	{
		for (int col = 0; col < src.cols; col++)
		{
			//1.5 設置索引,用於獲得不同條件下的映射表
			switch (index)
			{
			case 0:
				if (col > (0.25 * src.cols) && col < (0.75 * src.cols) && row>(0.25 * src.rows) && row < (0.75 * src.rows)) {
					map_x.at<float>(row, col) = 2 * (col - (src.cols *0.25) + 0.25);
					map_y.at<float>(row, col) = 2 * (row - (src.rows *0.25) + 0.25);
				}
				else {
					map_x.at<float>(row, col) = 0;                          
					map_y.at<float>(row, col) = 0;
				}
				break;//一定要加上這個,要不然按鍵之後,圖像不更新
			case 1:
				map_x.at<float>(row, col) = src.cols-1 - col;
 				map_y.at<float>(row, col) = src.rows-1 - row;
				break;//一定要加上這個,要不然按鍵之後,圖像不更新
			case 2:
				map_x.at<float>(row, col) = src.cols - 1 - col;
				map_y.at<float>(row, col) = row;
				break;//一定要加上這個,要不然按鍵之後,圖像不更新
			case 3:
				map_x.at<float>(row, col) = col;
				map_y.at<float>(row, col) = src.rows - 1 - row;
				break;//一定要加上這個,要不然按鍵之後,圖像不更新
			//default:
				//break;
			}



		}

	}
}

三 調試結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章