对于同一场景的2D全景图,如果想改变其视野中心位置,比如下图,初始情况下视野的中心位置是蓝框,如果想让红框的灯位于中心位置该怎么做呢?
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include
#include
#include
#include
#include 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负半轴顺时针映射到球面上的// y*/cv::Mat A = cv::Mat::zeros(3, 3, CV_32FC1);//旋转矩阵,绕z旋转和绕x旋转的矩阵相乘//https://blog.csdn.net/csxiaoshui/article/details/65446125cv::Mat B = cv::Mat::zeros(3, 1, CV_32FC1);//坐标矩阵cv::Mat AB;//旋转后的坐标cv::Point Pianyi = cv::Point(6, -38);//设置偏移量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();
}
union { float data[4]; struct { float x; float y; float z; }; };...
在立方体贴图空间内发射光线(视线),计算球面光线(视线)会击中哪个面的哪个像素的像素值,最终生成Equirectangular全景图。 InitSceneTexture():先获取Cubemaps并将其绑定在GPU中 void InitSceneTexture() {char* path = "./Cubemaps";myEnvi...
常量内存是NVIDIA提供的一个64KB大小的内存空间,它的处理方式和普通的全局内存和共享内存都不一样,是有cuda专门提供的。 线程束的概念:线程束是指一个包含32个线程的集合,在程序中的每一行,线程束中的每个线程都将在不同的数据上执行相同的指令。 因此,常量内存的作用是,能够将单次内存的读取操作广播到每个半线程束(即16个线程...
1、初始化,设置背景色 void glClear(int mask) 清除缓存 实參含义:GL10.GL_COLOR_BUFFER_BIT 清除颜色缓存 GL10.GL_DEPTH_BUFFER_BIT 清除深度缓存 ...
论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信[email protected]。opencv中ArUco模块实践(1)ArUco的生成与检测ArUco与AprilTag简介ChAruco...
在x y的梯度上再求一次导数后相加便是散度。注意不要使用convertScaleAbs int main(int argc, char*argv[]) {cv::Mat IMG = cv::imread("./img.jpg", 1);cv::Mat k = getStructuringElement(cv::MORPH_RECT,...
算法是基于A Fast Parallel Algorithm for Thinning Digital Patterns论文 https://blog.csdn.net/keneyr/article/details/88944563 简单的解释算法: https://blog.csdn.net/xukaiwen_2016...
第一行是提取有效区域后的鱼眼图;第二行就是展开图(第二张和第四张根据需要裁剪了一部分)
#include
cv::Mat inputIMG = cv::imread("./input/src.jpg", 1);cv::Mat graySrc, grad_x, grad_y;cv::Mat abs_grad_x, abs_grad_y;cv::cvtColor(inputIMG, graySrc, cv::COLOR_BGR2GRAY);...