实现2D全景图的中心视野变换
生活随笔
收集整理的這篇文章主要介紹了
实现2D全景图的中心视野变换
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)于同一場(chǎng)景的2D全景圖,如果想改變其視野中心位置,比如下圖,初始情況下視野的中心位置是藍(lán)框,如果想讓紅框的燈位于中心位置該怎么做呢?
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>
#include <iostream>
#include <vector>
#include <iostream>
#include <cmath>using namespace std;
#define PI 3.1415926535898void main()
{cv::Mat src = cv::imread("./img.jpg",-1);cv::Mat out = cv::Mat::zeros(src.size(), CV_32FC3);cv::Mat mapx(src.rows, src.cols, CV_32FC1);cv::Mat mapy(src.rows, src.cols, CV_32FC1);/* ^ z||—— ——> x phi是從與z軸正半軸夾角,theta是與x正半軸夾角,圖像是從y負(fù)半軸順時(shí)針映射到球面上的// y*/cv::Mat A = cv::Mat::zeros(3, 3, CV_32FC1);//旋轉(zhuǎn)矩陣,繞z旋轉(zhuǎn)和繞x旋轉(zhuǎn)的矩陣相乘//https://blog.csdn.net/csxiaoshui/article/details/65446125cv::Mat B = cv::Mat::zeros(3, 1, CV_32FC1);//坐標(biāo)矩陣cv::Mat AB;//旋轉(zhuǎn)后的坐標(biāo)cv::Point Pianyi = cv::Point(6, -38);//設(shè)置偏移量float pianyi_theta = 2.0 * PI * (src.cols / 2 - Pianyi.x) / src.cols - PI / 2.0;float pianyi_phi = PI * (Pianyi.y) / src.rows;A.at<float>(0, 0) = cos(pianyi_theta);A.at<float>(0, 1) = -sin(pianyi_theta) * cos(pianyi_phi);A.at<float>(0, 2) = sin(pianyi_theta) * sin(pianyi_phi);A.at<float>(1, 0) = sin(pianyi_theta);A.at<float>(1, 1) = cos(pianyi_theta) * cos(pianyi_phi);A.at<float>(1, 2) = -cos(pianyi_theta) * sin(pianyi_phi);A.at<float>(2, 0) = 0.0;A.at<float>(2, 1) = sin(pianyi_phi);A.at<float>(2, 2) = cos(pianyi_phi);for (int i = 0; i < src.rows; i++) {for (int j = 0; j < src.cols; j++) {cv::Point coor_uv = cv::Point(j, i);float theta = 2.0 * PI * (src.cols / 2 - coor_uv.x) / src.cols;float phi = PI * (src.rows/2 - coor_uv.y) / src.rows;float xcoor = sin(theta)*cos(phi);float ycoor = cos(phi) * cos(theta);float zcoor = sin(phi);B.at<float>(0, 0) = xcoor;B.at<float>(1, 0) = ycoor;B.at<float>(2, 0) = zcoor;AB = A*B;float final_theta = atan2(AB.at<float>(1, 0), AB.at<float>(0, 0));float final_phi = atan2(sqrt(pow(AB.at<float>(0, 0), 2)+ pow(AB.at<float>(1, 0), 2)), AB.at<float>(2, 0));float U_coor = src.cols * final_theta / (2 * PI);float V_coor = final_phi * src.rows / PI;//防止超出圖像邊界if (U_coor > src.cols) {U_coor = U_coor - src.cols- 1.0;}else if (U_coor < 0) {U_coor = src.cols + U_coor- 1.0;}if (V_coor > src.rows) {V_coor = V_coor - src.rows;}else if (V_coor < 0) {V_coor = src.rows+ V_coor;}cv::Point2f Final_uv = cv::Point2f(U_coor, V_coor);mapx.at<float>(i, j) = float(U_coor);mapy.at<float>(i, j) = float(V_coor);}}remap(src, out, mapx, mapy, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0, 0));imwrite("img.jpg", out);//cv::waitKey();
}
總結(jié)
以上是生活随笔為你收集整理的实现2D全景图的中心视野变换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几何空间中坐标系转换
- 下一篇: 使用cmd将磁盘转化为GPT格式