精华内容
下载资源
问答
  • 像素坐标
    千次阅读
    2021-04-22 13:17:41

    clc;close all;clear;

    %地理坐标和像素坐标的相互转换

    [pic,R]=geotiffread('boston.tif'); %读取带地理坐标信息的tif影像

    [m,n,~]=size(pic);

    %像素坐标转换为地理坐标

    figure(),imshow(pic),title('不带地理坐标的静态图片');

    hold on; scatter(n/,m/,,'r.'); %选择1/4处像素坐标,并在图上标示

    [lon,lat]=pix2map(R,m/,n/); %转换为地理坐标

    figure(),mapshow(pic,R);

    mapshow(lon,lat,'Marker','.','MarkerEdgeColor','r');

    title('带地理坐标的tif影像');

    axis off;

    %打印结果

    disp(['(',num2str(m/),',',num2str(n/),') -> (',num2str(lon),',',num2str(lat),')']);

    %地理坐标转换为像素坐标。注意地理坐标从左下角开始,而像素坐标从左上角开始

    %左下角开始点地理坐标为[R.XLimWorld(),R.YLimWorld()]

    %R.RasterWidthInWorld表示图像的地理宽度

    x=R.XLimWorld()+(/)*R.RasterWidthInWorld; %获取图像3/4处的地理坐标

    y=R.YLimWorld()+(/)*R.RasterHeightInWorld;

    figure(),mapshow(pic,R),axis off;

    mapshow(x,y,'Marker','*','MarkerEdgeColor','r');

    [row,col]=map2pix(R,x,y);

    figure(),imshow(pic);

    hold on;

    scatter(col,row,,'r*');

    %命令行中打印结果

    disp(['(',num2str(x),',',num2str(y),') -> (',num2str(row),',',num2str(col),')']);

    像素坐标转地理坐标:pix2map

    地理坐标转像素坐标:map2pix

    MATLAB 中几个颜色空间的坐标范围

    在一些图象处理的程序中,我们经常要在不同的颜色空间操作,而且经常要把各颜色空间的坐标转化到 [0,1] 之间,这就需要知道一些常用颜色空间的坐标范围. 虽然可以通过颜色空间转化的公式推导这些范围,但是 ...

    在matlab中进行遥感影像地理坐标的相互转换

    在matlab中进行图像处理,一般使用的都是图像本地坐标,以左上角(1,1)开始.处理完成后,如果要将结果在带地理坐标的遥感影像中显示,或者需要输出成shp文件,就需要涉及到本地坐标和地理坐标的转换, ...

    MATLAB中求矩阵非零元的坐标

    MATLAB中求矩阵非零元的坐标: 方法1: index=find(a); [i,j]=ind2sub(size(a),index); disp([i,j]) 方法2: [i,j]=find(a&gt ...

    matlab中subplot 在平铺位置创建坐标区

    来源:https://ww2.mathworks.cn/help/matlab/ref/subplot.html?searchHighlight=subplot&s_tid=doc_srcht ...

    Matlab中下标,斜体,及希腊字母的使用方法

    下面是Matlab官方列出来的Tex代码列表,包含了绝大部分的希腊字母和数学符号. Character Sequence Symbol Character Sequence Symbol Charac ...

    Matlab中imagesc用法

    来源:https://ww2.mathworks.cn/help/matlab/ref/imagesc.html?searchHighlight=imagesc&s_tid=doc_srcht ...

    matlab中imread 从图形文件读取图像

    来源:https://ww2.mathworks.cn/help/matlab/ref/imread.html?searchHighlight=imread&s_tid=doc_srchtit ...

    matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

    matlab中的卷积——filter,conv之间的区别

    %Matlab提供了计算线性卷积和两个多项式相乘的函数conv,语法格式w=conv(u,v),其中u和v分别是有限长度序列向量,w是u和v的卷积结果序列向量. %如果向量u和v的长度分别为N和M,则 ...

    随机推荐

    返回顶部的功能 div固定在页面位置不变

    1.你在网上搜索的时候,可能会搜索到div固定在页面上,不随滚动条滚动而滚动是用CSS写的,写法是position:fixed;bottom:0; 但是这个在iframe满地跑的页面实际开发中,有啥用 ...

    Odoo 报表中添加空格

    如果  不起作用,请用 代替.

    Bootstrap transition.js 插件详解

    Bootstrap 自带的 JavaScript 插件的动画效果几乎都是使用 CSS 过渡实现的,而其中的 transition.js 就是为了判断当前使用的浏览器是否支持 CSS 过渡.下面先来简单 ...

    linux 下删除重复行-- uniq 与 awk

    $ cat file liw liw liw hdsui mdksjd liw $ cat file | uniq -u # 只删除相邻的,不保留重复行 hdsui mdksjd liw $ cat ...

    node-sqlserver :微软发布的 SQL Server 的 Node.js 驱动

    node-sqlserver 是微软官方发布的 SQL Server 的 Node.js 的驱动程序.可允许 Windows 上运行的 Node.js 程序访问 SQL Server 和 Window ...

    doT.js实例详解

    doT.js详细介绍 doT.js特点是快,小,无依赖其他插件.官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolation{ ...

    ARM裸机开发中内存管理库RT_HEAP的使用

    在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动 ...

    Meltdown攻击

    Meltdown攻击处理器A级漏洞MELTDOWN(熔毁)和SPECTRE(幽灵)分析报告AntiyLabs • 2018年01月05日 • 漏洞 • 阅读 1162一.概述安天应急处理中心在2018 ...

    OpenLayers 3 之 地图图层数据来源(ol.source)详解

    更多相关内容
  • MATLAB图片点的像素坐标,可以精准的查看图片上每一个点的坐标,很精确,达到0.0001个像素!!! MATLAB图片点的像素坐标,可以精准的查看图片上每一个点的坐标,很精确,达到0.0001个像素!!!
  • GETMIDPOINTCIRCLE 返回一个圆的 x,y 像素坐标[xy] = getmidpointcircle(x0, y0, radius) 返回像素坐标以像素位置 [x0 y0] 为中心的圆和给定整数的半径。 中点圆算法用于计算( ...
  • 页面JS光标/鼠标坐标,百度统计中有个热点统计图,我们要做的就是获取光标的像素坐标
  • 该资源主要是实现像素坐标与投影坐标间的转换,转换精度基本为零,转换公式原理及转换测试精度可见:https://blog.csdn.net/weixin_47156401/article/details/124444130?spm=1001.2014.3001.5502
  • 本程序结合我的博客而仿真的,网址是:https://mp.csdn.net/postedit/82115829
  • 可通过改变代码中图片的输入路径,输入任意图片,并读取出图片上任意点的亚像素坐标。 可通过改变代码中图片的输入路径,输入任意图片,并读取出图片上任意点的亚像素坐标
  • 一个可以手动点击图片上任意一个点的时候,可以查看该点的亚像素坐标,精确到0.0001
  • 获取屏幕像素坐标工具,用于研究其他应用,调试程序
  • 能够将图像坐标转化为世界坐标,根据图像像素修改参数
  • matlab 显示图形的像素坐标,随着鼠标的变化而变化
  • 本文主要是对像素坐标转投影坐标、投影坐标转像素坐标的原理进行介绍及代码上的实现!!! 一、.tif 影像基本信息介绍 1、影像借本信息 上图是我使用 QGIS 打开的一副遥感影像的基本属性,上图中 (CRS)...

            本文主要是对像素坐标转投影坐标、投影坐标转像素坐标的原理进行介绍及代码上的实现!!! 

            误差基本为零!

            坐标转换整套流程包括:像素坐标转投影坐标、投影坐标转大地坐标、大地坐标转空间直角坐标、七参数转换、空间直角坐标转大地坐标、大地坐标转投影坐标、投影坐标转像素坐标; 本人均已实现,且每一个环节都已经过测试、如有需要欢迎在下方留言评论!!!

    一、.tif 影像基本信息介绍

    1、影像借本信息

            上图是我使用 QGIS 打开的一副遥感影像的基本属性,上图中 (CRS)范围中的数据对应着该遥感影像的左上角和右下角坐标;

    2、遥感影像左上角、右下角坐标和像素大小、宽度、高度之间的关系

    二、投影坐标与像素坐标间的转化原理

    1、像素坐标转投影坐标 

    2、投影坐标转像素坐标

    三、代码实现 

    1、像素坐标转投影坐标 

    #include<iostream>
    #include<fstream>
    #include<ogrsf_frmts.h>
    #include<ogr_geometry.h>
    #include<gdal_priv.h>
    #include<gdal.h>
    #include "gdalwarper.h"  
    #include<opencv2/opencv.hpp>    
    
    using namespace cv;
    using namespace std;
    
    
    //获取 .tif 图像的投影信息
    void getTfw(const char* path, double* geo)
    {
        //path是.tif的绝对路径
        //geo[6]为数组
        GDALAllRegister();
    
        GDALDataset* podataset = (GDALDataset*)GDALOpen(path, GA_ReadOnly);
    
        //保存 .tif 文件的投影信息' x=geo[0]、y=geo[3]、像素大小=geo[1]
        //double oldGeo[6];
    
        podataset->GetGeoTransform(geo);
    }
    
    
    //像素坐标转投影坐标(基本无误差)源坐标系
    void pixelsPoint2ProjectPoint(vector<Point2d>& PixelsPoints, vector<Point2d>& ProjectPoints, string path)
    {
        //vector<Point2d> res;        //保存投影坐标
    
        //获取 .tif 文件的投影信息
        getTfw(OLDPATH, oldGeo);
    
        //创建保存投影坐标的文件
        //ofstream ofile(".\\oldProjectPoints.txt");
        ofstream ofile(path);
    
        if (!ofile.is_open())
        {
            cout << "打开文件失败!" << endl;
            return;
        }
    
        for (auto it = PixelsPoints.begin(); it != PixelsPoints.end(); it++)
        {
            Point2d projectPoint;
    
            projectPoint.x = oldGeo[1] * (*it).x + oldGeo[0];
            projectPoint.y = oldGeo[3] - oldGeo[1] * (*it).y;
    
            //保存旧坐标系的投影坐标
            ProjectPoints.push_back(projectPoint);
    
            //把旧坐标系的投影坐标保存到 .txt 文件中
            ofile << setprecision(20) << projectPoint.x << "," << setprecision(20) << projectPoint.y << endl;
        }
        ofile.close();
    }

    2、投影坐标转像素坐标 

    //获取 .tif 图像的投影信息
    void getTfw(const char* path, double* geo)
    {
        //path是.tif的绝对路径
        //geo[6]为数组
        GDALAllRegister();
    
        GDALDataset* podataset = (GDALDataset*)GDALOpen(path, GA_ReadOnly);
    
        //保存 .tif 文件的投影信息' x=geo[0]、y=geo[3]、像素大小=geo[1]
        //double oldGeo[6];
    
        podataset->GetGeoTransform(geo);
    }
    
    
    //投影坐标转像素坐标(基本无误差)
    void projectPoint2PixelsPoint(vector<Point2d>& ProjectPoints, vector<Point2d>& PixelsPoints, string path)
    {
        //vector<Point2d> res;        //保存像素坐标
    
        //获取 .tif 文件的投影信息,应转像素时转一次就够了(影像不同或许需要转两次)
        //NEWPATH为tif影像路径,double newGeo[6];
        getTfw(NEWPATH, newGeo);
    
    
        //创建保存投影坐标的文件
        //ofstream ofile(".\\newPixelsPoints.txt");
        ofstream ofile(path);
    
        if (!ofile.is_open())
        {
            cout << "打开文件失败!" << endl;
            return;
        }
    
        for (auto it = ProjectPoints.begin(); it != ProjectPoints.end(); it++)
        {
            Point2d pixelsPoint;
    
            pixelsPoint.x = ((*it).x - newGeo[0]) / newGeo[1];
            pixelsPoint.y = (newGeo[3] - (*it).y) / newGeo[1];
    
            //保存新坐标系的像素坐标
            PixelsPoints.push_back(pixelsPoint);
    
            ofile << setprecision(20) << pixelsPoint.x << "," << setprecision(20) << pixelsPoint.y << endl;
        }
        ofile.close();
    }

    说明:获取 .tif 影像的投影信息请参考:c++ 读取 .tfw 文件数据(读取 .tif 影像中的投影信息)_一米九零小胖子的博客-CSDN博客_tfw文件 

    四、测试结果

    1、像素坐标 

    2、像素坐标转投影坐标结果 

     3、投影坐标转像素坐标结果

    由上述转换结果可知,转换误差基本为零!!! 

    坐标转换整套流程包括:像素坐标转投影坐标、投影坐标转大地坐标、大地坐标转空间直角坐标、七参数转换、空间直角坐标转大地坐标、大地坐标转投影坐标、投影坐标转像素坐标; 本人均已实现,且每一个环节都已经过测试、如有需要欢迎在下方留言评论!!!

    展开全文
  • 像素坐标转世界坐标的计算

    千次阅读 2020-12-16 00:11:00
    原理下图表示了小孔成像模型(图片及公式参考opencv官方资料)这个图里涉及4个坐标系:世界坐标系:其坐标原点可视情况而定,可以表示空间的物体,单位为长度单位,比如mm,用矩阵表示;相机坐标系:以摄像机光心为...

    原理

    下图表示了小孔成像模型(图片及公式参考opencv官方资料)

    这个图里涉及4个坐标系:

    世界坐标系:其坐标原点可视情况而定,可以表示空间的物体,单位为长度单位,比如mm,用矩阵

    表示;

    相机坐标系:以摄像机光心为原点(在针孔模型中也就是针孔为中心),z轴与光轴重合,也就是z轴指向相机的前方(与成像平面垂直),x轴与y轴的正方向与世界坐标系平行,单位为长度单位,比如mm,用矩阵

    表示;

    图像物理坐标系(也叫成像平面坐标系):用物理长度单位表示像素的位置,坐标原点为摄像机光轴与图像物理坐标系的交点位置。坐标系为图上o-xy,单位为长度单位,比如mm,用矩阵

    表示。

    像素坐标系:坐标原点在左上角,以像素为单位,有明显的范围限制,即用于表示全画面的像素长和像素长宽,矩阵

    表示。

    以下公式描述了

    之间的转换关系。

    以上公式中,

    表示1个像素有多少长度,即用传感器的尺寸除以像素数量,比如2928.384umx2205.216um的传感的分辨率为2592x1944,每个像素的大小即约1.12um。

    表示焦距,在上图中根据相似三角形,P点和p点具有以下关系:

    ,可见:

    越大,

    越大,

    越大,

    越小。

    表示中心点在像素坐标系中的位置。

    要求像素坐标系中某像素点对应在世界坐标系中的位置,需要知道相机的内参、外参,相机的内参可以通过标定获得,外参可以人为设定。

    第一步,将像素坐标变换到相机坐标系:

    两边乘以K的逆后推导出:

    第二步,从相机坐标系变换到世界坐标系:

    将方程乘以

    ,可以推导出:

    代码

    通过输入相机的内参,旋转向量,平移向量和像素坐标,可以通过以下函数求出对应的世界坐标点。

    以下代码中需求注意要对平移向量取转置,将1x3矩阵变为3x1矩阵后,才能实现3x3矩阵和3x1矩阵的乘法运算。

    void cameraToWorld(InputArray cameraMatrix, InputArray rV, InputArray tV, vector imgPoints, vector &worldPoints)

    {

    Mat invK64, invK;

    invK64 = cameraMatrix.getMat().inv();

    invK64.convertTo(invK, CV_32F);

    Mat r, t, rMat;

    rV.getMat().convertTo(r, CV_32F);

    tV.getMat().convertTo(t, CV_32F);

    Rodrigues(r, rMat);

    //计算 invR * T

    Mat invR = rMat.inv();

    //cout << "invR\n" << invR << endl;

    //cout << "t\n" << t << t.t() << endl;

    Mat transPlaneToCam;

    if(t.size() == Size(1, 3)){

    transPlaneToCam = invR * t;//t.t();

    }

    else if(t.size() == Size(3, 1)){

    transPlaneToCam = invR * t.t();

    }

    else{

    return;

    }

    //cout << "transPlaneToCam\n" << transPlaneToCam << endl;

    int npoints = (int)imgPoints.size();

    //cout << "npoints\n" << npoints << endl;

    for (int j = 0; j < npoints; ++j){

    Mat coords(3, 1, CV_32F);

    Point3f pt;

    coords.at(0, 0) = imgPoints[j].x;

    coords.at(1, 0) = imgPoints[j].y;

    coords.at(2, 0) = 1.0f;

    //[x,y,z] = invK * [u,v,1]

    Mat worldPtCam = invK * coords;

    //cout << "worldPtCam:" << worldPtCam << endl;

    //[x,y,1] * invR

    Mat worldPtPlane = invR * worldPtCam;

    //cout << "worldPtPlane:" << worldPtPlane << endl;

    //zc

    float scale = transPlaneToCam.at(2) / worldPtPlane.at(2);

    //cout << "scale:" << scale << endl;

    Mat scale_worldPtPlane(3, 1, CV_32F);

    //scale_worldPtPlane.at(0, 0) = worldPtPlane.at(0, 0) * scale;

    //zc * [x,y,1] * invR

    scale_worldPtPlane = scale * worldPtPlane;

    //cout << "scale_worldPtPlane:" << scale_worldPtPlane << endl;

    //[X,Y,Z]=zc*[x,y,1]*invR - invR*T

    Mat worldPtPlaneReproject = scale_worldPtPlane - transPlaneToCam;

    //cout << "worldPtPlaneReproject:" << worldPtPlaneReproject << endl;

    pt.x = worldPtPlaneReproject.at(0);

    pt.y = worldPtPlaneReproject.at(1);

    //pt.z = worldPtPlaneReproject.at(2);

    pt.z = 1.0f;

    worldPoints.push_back(pt);

    }

    }

    def cameraToWorld(self, cameraMatrix, r, t, imgPoints):

    invK = np.asmatrix(cameraMatrix).I

    rMat = np.zeros((3, 3), dtype=np.float64)

    cv2.Rodrigues(r, rMat)

    #print('rMat=', rMat)

    #计算 invR * T

    invR = np.asmatrix(rMat).I #3*3

    #print('invR=', invR)

    transPlaneToCam = np.dot(invR , np.asmatrix(t)) #3*3 dot 3*1 = 3*1

    #print('transPlaneToCam=', transPlaneToCam)

    worldpt = []

    coords = np.zeros((3, 1), dtype=np.float64)

    for imgpt in imgPoints:

    coords[0][0] = imgpt[0][0]

    coords[1][0] = imgpt[0][1]

    coords[2][0] = 1.0

    worldPtCam = np.dot(invK , coords) #3*3 dot 3*1 = 3*1

    #print('worldPtCam=', worldPtCam)

    #[x,y,1] * invR

    worldPtPlane = np.dot(invR , worldPtCam) #3*3 dot 3*1 = 3*1

    #print('worldPtPlane=', worldPtPlane)

    #zc

    scale = transPlaneToCam[2][0] / worldPtPlane[2][0]

    #print("scale: ", scale)

    #zc * [x,y,1] * invR

    scale_worldPtPlane = np.multiply(scale , worldPtPlane)

    #print("scale_worldPtPlane: ", scale_worldPtPlane)

    #[X,Y,Z]=zc*[x,y,1]*invR - invR*T

    worldPtPlaneReproject = np.asmatrix(scale_worldPtPlane) - np.asmatrix(transPlaneToCam) #3*1 dot 1*3 = 3*3

    #print("worldPtPlaneReproject: ", worldPtPlaneReproject)

    pt = np.zeros((3, 1), dtype=np.float64)

    pt[0][0] = worldPtPlaneReproject[0][0]

    pt[1][0] = worldPtPlaneReproject[1][0]

    pt[2][0] = 0

    worldpt.append(pt.T.tolist())

    #print('worldpt:',worldpt)

    return worldpt

    验证

    先使用projectPoints生成像素点:

    Vec3f eulerAngles;//欧拉角

    vector translation_vectors;/* 每幅图像的平移向量 */

    Mat rotationMatrix = eulerAnglesToRotationMatrix(eulerAngles);

    *pR_matrix = rotationMatrix;

    cvRodrigues2(pR_matrix, pnew_vec, 0); //从旋转矩阵求旋转向量

    Mat mat_tmp(pnew_vec->rows, pnew_vec->cols, pnew_vec->type, pnew_vec->data.fl);

    cv::Mat distortion_coeffs1 = cv::Mat(1, 5, CV_32FC1, cv::Scalar::all(0)); /* 摄像机的5个畸变系数:k1,k2,p1,p2,k3 */

    projectPoints(tempPointSet, mat_tmp, translation_vectors[i], intrinsic_matrix, distortion_coeffs1, image_points2);

    使用以下欧拉角:

    [0, 0, 0]//欧拉角度,表示平面和相机的角度

    旋转向量:[0, 0, 0]

    对应的平移向量,表示空间坐标原点相对在相平面原点偏移x=134mm,y=132mm,z=200mm。

    原始:[134.0870803179094, 132.7580766544178, 200.3789038923399]

    生成空间坐标点:

    Size board_size = Size(11,8);

    Size square_size = Size(30, 30);

    vector tempPointSet;

    for (int j = 0; j

    {

    for (int i = 0; i

    {

    /* 假设定标板放在世界坐标系中z=0的平面上 */

    Point3f tempPoint;

    tempPoint.x = i*square_size.height;

    tempPoint.y = j*square_size.width;

    tempPoint.z = 0;

    tempPointSet.push_back(tempPoint);

    }

    }

    经projectPoints计算后对应的像素空间点是:

    projectPoints(tempPointSet, mat_tmp, translation_vectors[i], intrinsic_matrix, distortion_coeffs1, image_points2);

    cout << "原始空间点:\n" << image_points2 << endl;

    [1194.8174, 1074.1355;

    1285.1735, 1074.1355;

    1375.5295, 1074.1355;

    1465.8856, 1074.1355;

    1556.2417, 1074.1355;

    1646.5978, 1074.1355;

    1736.9539, 1074.1355;

    1827.3099, 1074.1355;

    1917.666, 1074.1355;

    2008.0221, 1074.1355;

    2098.3782, 1074.1355;

    1194.8174, 1164.5713;

    1285.1735, 1164.5713;

    1375.5295, 1164.5713;

    1465.8856, 1164.5713;

    1556.2417, 1164.5713;

    1646.5978, 1164.5713;

    1736.9539, 1164.5713;

    1827.3099, 1164.5713;

    1917.666, 1164.5713;

    2008.0221, 1164.5713;

    2098.3782, 1164.5713;

    1194.8174, 1255.0072;

    1285.1735, 1255.0072;

    1375.5295, 1255.0072;

    1465.8856, 1255.0072;

    1556.2417, 1255.0072;

    1646.5978, 1255.0072;

    1736.9539, 1255.0072;

    1827.3099, 1255.0072;

    1917.666, 1255.0072;

    2008.0221, 1255.0072;

    2098.3782, 1255.0072;

    1194.8174, 1345.443;

    1285.1735, 1345.443;

    1375.5295, 1345.443;

    1465.8856, 1345.443;

    1556.2417, 1345.443;

    1646.5978, 1345.443;

    1736.9539, 1345.443;

    1827.3099, 1345.443;

    1917.666, 1345.443;

    2008.0221, 1345.443;

    2098.3782, 1345.443;

    1194.8174, 1435.8789;

    1285.1735, 1435.8789;

    1375.5295, 1435.8789;

    1465.8856, 1435.8789;

    1556.2417, 1435.8789;

    1646.5978, 1435.8789;

    1736.9539, 1435.8789;

    1827.3099, 1435.8789;

    1917.666, 1435.8789;

    2008.0221, 1435.8789;

    2098.3782, 1435.8789;

    1194.8174, 1526.3147;

    1285.1735, 1526.3147;

    1375.5295, 1526.3147;

    1465.8856, 1526.3147;

    1556.2417, 1526.3147;

    1646.5978, 1526.3147;

    1736.9539, 1526.3147;

    1827.3099, 1526.3147;

    1917.666, 1526.3147;

    2008.0221, 1526.3147;

    2098.3782, 1526.3147;

    1194.8174, 1616.7506;

    1285.1735, 1616.7506;

    1375.5295, 1616.7506;

    1465.8856, 1616.7506;

    1556.2417, 1616.7506;

    1646.5978, 1616.7506;

    1736.9539, 1616.7506;

    1827.3099, 1616.7506;

    1917.666, 1616.7506;

    2008.0221, 1616.7506;

    2098.3782, 1616.7506;

    1194.8174, 1707.1864;

    1285.1735, 1707.1864;

    1375.5295, 1707.1864;

    1465.8856, 1707.1864;

    1556.2417, 1707.1864;

    1646.5978, 1707.1864;

    1736.9539, 1707.1864;

    1827.3099, 1707.1864;

    1917.666, 1707.1864;

    2008.0221, 1707.1864;

    2098.3782, 1707.1864]

    经函数求出的空间坐标点是:

    vector worldPoint;

    cameraToWorld(intrinsic_matrix, mat_tmp, translation_vec_tmp, image_points2, worldPoint);

    cout << "计算空间点:\n" << worldPoint << endl;

    [0, 0, 1;

    30, 0, 1;

    60, 0, 1;

    90.000015, 0, 1;

    120.00002, 0, 1;

    149.99995, 0, 1;

    179.99998, 0, 1;

    209.99998, 0, 1;

    239.99998, 0, 1;

    270, 0, 1;

    300, 0, 1;

    0, 29.999985, 1;

    30, 29.999985, 1;

    60, 29.999985, 1;

    90.000015, 29.999985, 1;

    120.00002, 29.999985, 1;

    149.99995, 29.999985, 1;

    179.99998, 29.999985, 1;

    209.99998, 29.999985, 1;

    239.99998, 29.999985, 1;

    270, 29.999985, 1;

    300, 29.999985, 1;

    0, 60.000015, 1;

    30, 60.000015, 1;

    60, 60.000015, 1;

    90.000015, 60.000015, 1;

    120.00002, 60.000015, 1;

    149.99995, 60.000015, 1;

    179.99998, 60.000015, 1;

    209.99998, 60.000015, 1;

    239.99998, 60.000015, 1;

    270, 60.000015, 1;

    300, 60.000015, 1;

    0, 89.999969, 1;

    30, 89.999969, 1;

    60, 89.999969, 1;

    90.000015, 89.999969, 1;

    120.00002, 89.999969, 1;

    149.99995, 89.999969, 1;

    179.99998, 89.999969, 1;

    209.99998, 89.999969, 1;

    239.99998, 89.999969, 1;

    270, 89.999969, 1;

    300, 89.999969, 1;

    0, 120.00002, 1;

    30, 120.00002, 1;

    60, 120.00002, 1;

    90.000015, 120.00002, 1;

    120.00002, 120.00002, 1;

    149.99995, 120.00002, 1;

    179.99998, 120.00002, 1;

    209.99998, 120.00002, 1;

    239.99998, 120.00002, 1;

    270, 120.00002, 1;

    300, 120.00002, 1;

    0, 149.99998, 1;

    30, 149.99998, 1;

    60, 149.99998, 1;

    90.000015, 149.99998, 1;

    120.00002, 149.99998, 1;

    149.99995, 149.99998, 1;

    179.99998, 149.99998, 1;

    209.99998, 149.99998, 1;

    239.99998, 149.99998, 1;

    270, 149.99998, 1;

    300, 149.99998, 1;

    0, 179.99998, 1;

    30, 179.99998, 1;

    60, 179.99998, 1;

    90.000015, 179.99998, 1;

    120.00002, 179.99998, 1;

    149.99995, 179.99998, 1;

    179.99998, 179.99998, 1;

    209.99998, 179.99998, 1;

    239.99998, 179.99998, 1;

    270, 179.99998, 1;

    300, 179.99998, 1;

    0, 209.99998, 1;

    30, 209.99998, 1;

    60, 209.99998, 1;

    90.000015, 209.99998, 1;

    120.00002, 209.99998, 1;

    149.99995, 209.99998, 1;

    179.99998, 209.99998, 1;

    209.99998, 209.99998, 1;

    239.99998, 209.99998, 1;

    270, 209.99998, 1;

    300, 209.99998, 1]

    可以对比按11*8格和30mm/格所生成空间坐标点结果,基本一致。

    展开全文
  • 相机成像原理,像素坐标到图像坐标,图像坐标到相机坐标,相机坐标到空间三维世界坐标的推导,仿真。
  • 得到图像像素坐标

    热门讨论 2013-04-11 09:49:26
    很好的VC代码 当鼠标放在打开图像的窗口上时可以得到该点的像素坐标 和大家分享一下 希望有用~~
  • 像素角点定位函数代码,输入参数为角点像素级粗略坐标,输出精确的亚像素级角点坐标
  • 将“右上角和赤纬”中给出的目标坐标转换为TESS主要任务26个观测扇区(第1年和第2年)和第3-4年(直至第55个扇区)的TESS检测器像素坐标。还可以查询MAST以获取恒星的检测器像素坐标。仅凭TIC ID(此选项必须在线)...
  • 像素坐标三角板.exe

    2017-06-23 10:13:46
    像素坐标三角板.exe
  • 图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系 构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右...

    四个坐标系都是什么?

    1.世界坐标系->相机坐标系->图像坐标系->像素坐标系

    2.像素坐标系->图像坐标系->相机坐标系->世界坐标系

    图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系

                       

    构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点。
    接下来的重点,就是关于这几个坐标系的转换。也就是说,一个现实中的物体是如何在图像中成像的。

    四个坐标系之间的相互转换

    1. 从世界坐标系到相机坐标系

                这里写图片描述

     其中[ x ′ , y ′ ] 为世界坐标系下的坐标,将世界坐标系顺时针旋转θ得到相机坐标系,将[ x ′ , y ′ ]在相机坐标系下的坐标记为[ x , y ]。z轴坐标不发生改变。相当于我们沿z轴做旋转。

       

    如果将世界坐标系逆时针旋转θ得到相机坐标系,此时得到坐标变换过程为:      
                            image-20201112103748950

     此时,我们

                       

    同理我们沿着剩下的两个坐标轴x和y进行旋转得到可以有剩下的两个变换矩阵R2和R3,那么我们从世界坐标系变换到相机坐标系所需要进行的变换是R = R1R2R3

    这样我们就得到了,沿着Z轴方向旋转后的相机坐标new,和世界坐标wold之间的转换关系。

                      

    同理可得,沿着x轴和沿着y轴旋转的变化分别如下:

                       

     于是,新的相机坐标,即同时沿着x,y,z轴三个方向旋转的矩阵R如下:

     

     于是,世界坐标系到相机坐标系的转化可以写成:

                   

    进行平移变换得到的结果为:
                        这里写图片描述

    2. 从相机坐标系变换到图像坐标系,属于透视投影关系,从3D转换到2D。

           在这里插入图片描述

     此时投影点p的单位还是mm,并不是pixel,需要进一步转换到像素坐标系。

    3. 从图像坐标系到像素坐标系。

           像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫principal point。图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这二者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,即1pixel=dx mm

                       在这里插入图片描述

     那么通过上面四个坐标系的转换就可以得到一个点从世界坐标系如何转换到像素坐标系的。

        在这里插入图片描述

     其中相机的内参和外参可以通过张正友标定获取,通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的Zc的值。

    其实在大多数时候,直接是像素坐标系和相机坐标系之间进行转换,因此可以将这两部分的转化矩阵合并,从而得到:

         

    这样我们就完成了从世界坐标系到相机坐标系的一个转换,如果将K1记录为相机的外参,K2为相机的内参。那么像素坐标系和世界坐标系可以之间的关系可以表示为如下的

                        

    像素坐标系->图像坐标系->相机坐标系->世界坐标系

                            

     

    展开全文
  • 像素坐标系一系列变换. 世界坐标系->相机坐标系 世界坐标系下的点可以通过旋转和平移转到相机坐标系下. 其中T的定义: 也就是我们说的相机的外参矩阵,OpenCV中可以通过SolvePnP等方法算出. 相机坐标...
  •      ...计算机视觉领域中常见的四个坐标系:像素坐标系、图像坐标系,相机坐标系,世界坐标系。 像素坐标系(u,v)(u,v)(u,v) 图像坐标系(x,y)(x,y)(x,y) 相
  • 新学期第一天开始写的这篇文章,看看我啥时候能把他发...相机焦距f,相机之间距离为b,右上角为目标位置P(x,y),目标的水平坐标为x,相机离目标垂直距离(所求目标距离相机的深度)为z。 如果要计算深度z,必须.
  • 按照十四讲的顺序我们首先接触的是像素坐标系、图像坐标系、相机坐标系、相机归一化坐标系、世界坐标系,这里学着学着就蒙了,所以我建议先学习投影模型,我认为二者可以理解为互逆过程。
  • "```\n// 经纬度坐标转像素坐标\nfunction latlng2px(lat, lng) {\n var LatLng = (function(){\n function LatLng(lat, lng){\n this.lat = lat;\n this.lng = lng;\n }\n ret...
  • 单目固定平面已知像素坐标求世界坐标方法
  • 五、图像坐标系(Ox-y)与像素坐标系(Ou-v) 问题2(1):图像坐标系mm怎么转换为piex,即怎么计算成像平面中的1piex = dxmm (即计算dx,dy) 问题2(2):怎么计算u0,v0(图像坐标系原点相对于像素坐标系的位置) ...
  • openlayers的地图坐标的转换,地图坐标与屏幕像素坐标的互转。 具体方法: 地图坐标转屏幕像素(getPixelFromCoordinate):入口 屏幕像素转地图坐标(getCoordinateFromPixel):入口 封装方法源码: ...
  • 像素坐标计算x&y坐标

    千次阅读 2020-12-16 00:10:58
    y坐标,但以厘米为单位(坐标系在曲面中)。有没有办法存档?我正在使用python,但如果有任何帮助,我将不胜感激!:)编辑:我尝试了同音字法从下面,但我没有安静设法使它工作。她就是我所做的:#two sets of points ...
  • 1、以图像左上角为原点建立以像素为单位的直接坐标系u-v(像素坐标系)。像素的横坐标u与纵坐标v分别是在其图像数组中所在的列数与所在行数。(在OpenCV中u对应x,v对应y)(x y o1图像坐标系) 2、由于(u,v)只代表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 197,503
精华内容 79,001
关键字:

像素坐标