Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 将梯形中的点位置转换为矩形位置_Matrix_Computer Vision_Transformation_Homography - Fatal编程技术网

Matrix 将梯形中的点位置转换为矩形位置

Matrix 将梯形中的点位置转换为矩形位置,matrix,computer-vision,transformation,homography,Matrix,Computer Vision,Transformation,Homography,我试图找出如何将下面绿色梯形中的坐标Pxy转换为真实地平面上的等效坐标 我有房间的精确尺寸,这意味着我可以准确地说出A、B、C和D在下面所示的房间里有多长。 我还知道A、B、C和D在绿色三角形中的长度(坐标方向) 我已经读过关于单应和矩阵变换的书,但我还不能完全理解它。任何能引导我走向正确方向的建议都将不胜感激 谢谢 有使用Opencv库计算仿射变换矩阵的代码(它显示了如何将梯形变换为矩形,以及如何找到变换矩阵以进行进一步计算): //本书中的示例 //学习OpenCV:使用OpenCV库进行计

我试图找出如何将下面绿色梯形中的坐标Pxy转换为真实地平面上的等效坐标

我有房间的精确尺寸,这意味着我可以准确地说出A、B、C和D在下面所示的房间里有多长。 我还知道A、B、C和D在绿色三角形中的长度(坐标方向)

我已经读过关于单应和矩阵变换的书,但我还不能完全理解它。任何能引导我走向正确方向的建议都将不胜感激

谢谢


有使用Opencv库计算仿射变换矩阵的代码(它显示了如何将梯形变换为矩形,以及如何找到变换矩阵以进行进一步计算):

//本书中的示例
//学习OpenCV:使用OpenCV库进行计算机视觉
//加里·布拉德斯基和阿德里安·凯勒
//O'Reilly Media出版,2008年10月3日
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
IplImage*src=0,*dst=0;
//图像的绝对或相对路径应为argv[1]
char*filename=argc==2?argv[1]:“Image0.jpg”;
//了解情况
src=cvLoadImage(文件名,1);
printf(“[i]图像:%s\n”,文件名);
断言(src!=0);
//点(角点)
CvPoint2D32f srcQuad[4],dstQuad[4];
//变换矩阵
CvMat*warp_matrix=cvCreateMat(3,3,CV_32FC1);
//克隆图像
dst=克隆图像(src);
//定义所有点
//这里是梯形的角坐标
srcQuad[0]。x=??;//src左上角
srcQuad[0]。y=??;
srcQuad[1].x=??;//src右上角
srcQuad[1]。y=??;
srcQuad[2].x=??;//src左下角
srcQuad[2].y=??;
srcQuad[3].x=??;//src Bot right
srcQuad[3].y=??;
//- - - - - - - - - - - - - -//
//src图像中矩形的坐标
dstQuad[0].x=0;//dst左上角
dstQuad[0].y=0;
dstQuad[1].x=src->width-1;//dst右上角
dstQuad[1],y=0;
dstQuad[2].x=0;//dst左下角
dstQuad[2]。y=src->height-1;
dstQuad[3].x=src->width-1;//dst Bot right
dstQuad[3]。y=src->height-1;
//获取可用于计算的变换矩阵
//点Pxy的坐标
cvGetPerspectiveTransform(srcQuad、dstQuad、扭曲矩阵);
//透视变换
CVWarp透视图(src、dst、warp_矩阵);
cvNamedWindow(“cvWarpPerspective”,1);
cvShowImage(“cvWarpPerspective”,dst);
cvWaitKey(0);
cvReleaseMat(和warp_矩阵);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvallwindows();
返回0;

希望对您有所帮助!

有使用Opencv库计算仿射变换矩阵的代码(它显示了如何将梯形变换为矩形,以及如何找到变换矩阵以进行进一步计算):

//本书中的示例
//学习OpenCV:使用OpenCV库进行计算机视觉
//加里·布拉德斯基和阿德里安·凯勒
//O'Reilly Media出版,2008年10月3日
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
IplImage*src=0,*dst=0;
//图像的绝对或相对路径应为argv[1]
char*filename=argc==2?argv[1]:“Image0.jpg”;
//了解情况
src=cvLoadImage(文件名,1);
printf(“[i]图像:%s\n”,文件名);
断言(src!=0);
//点(角点)
CvPoint2D32f srcQuad[4],dstQuad[4];
//变换矩阵
CvMat*warp_matrix=cvCreateMat(3,3,CV_32FC1);
//克隆图像
dst=克隆图像(src);
//定义所有点
//这里是梯形的角坐标
srcQuad[0]。x=??;//src左上角
srcQuad[0]。y=??;
srcQuad[1].x=??;//src右上角
srcQuad[1]。y=??;
srcQuad[2].x=??;//src左下角
srcQuad[2].y=??;
srcQuad[3].x=??;//src Bot right
srcQuad[3].y=??;
//- - - - - - - - - - - - - -//
//src图像中矩形的坐标
dstQuad[0].x=0;//dst左上角
dstQuad[0].y=0;
dstQuad[1].x=src->width-1;//dst右上角
dstQuad[1],y=0;
dstQuad[2].x=0;//dst左下角
dstQuad[2]。y=src->height-1;
dstQuad[3].x=src->width-1;//dst Bot right
dstQuad[3]。y=src->height-1;
//获取可用于计算的变换矩阵
//点Pxy的坐标
cvGetPerspectiveTransform(srcQuad、dstQuad、扭曲矩阵);
//透视变换
CVWarp透视图(src、dst、warp_矩阵);
cvNamedWindow(“cvWarpPerspective”,1);
cvShowImage(“cvWarpPerspective”,dst);
cvWaitKey(0);
cvReleaseMat(和warp_矩阵);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvallwindows();
返回0;
希望它能有所帮助!


如果我正确理解了您的问题,您正在寻找表示位置和方向的变换矩阵(也称为“姿势”)你的相机相对于世界的坐标。如果你有这个矩阵-让我们称它为M-你可以将相机坐标系中的任何点映射到世界坐标系,反之亦然。在你的情况下,你需要将一个矩形变换到世界坐标系中的平面(0,1,0)^T+0上

有几种方法可以导出此姿势矩阵。首先,您需要知道另一个矩阵-K,它描述了将相机坐标帧中的位置转换为实际像素位置的内部相机参数。这包括标准针孔投影以及径向失真和其他一些内容

要同时确定KM,您必须校准您的相机。这通常通过使用校准模式(例如棋盘模式)来完成,其中
//example from book
//   Learning OpenCV: Computer Vision with the OpenCV Library
//     by Gary Bradski and Adrian Kaehler
//     Published by O'Reilly Media, October 3, 2008

#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    IplImage *src=0, *dst=0;

    // absolute or relative path to image should be in argv[1]
    char* filename = argc == 2 ? argv[1] : "Image0.jpg";
    // get the picture
    src = cvLoadImage(filename,1);

    printf("[i] image: %s\n", filename);
    assert( src != 0 );


    // points (corners of )
    CvPoint2D32f srcQuad[4], dstQuad[4];
    // transformation matrix
    CvMat* warp_matrix = cvCreateMat(3,3,CV_32FC1);

    // clone image
    dst = cvCloneImage(src);

    // define all the points
    //here the coordinates of corners of your trapezoid 
    srcQuad[0].x = ??;   //src Top left
    srcQuad[0].y = ??;
    srcQuad[1].x = ??;   //src Top right
    srcQuad[1].y = ??;
    srcQuad[2].x = ??;   //src Bottom left
    srcQuad[2].y = ??;
    srcQuad[3].x = ??;   //src Bot right
    srcQuad[3].y = ??;
    //- - - - - - - - - - - - - -//
    //coordinates of rectangle in src image 
    dstQuad[0].x = 0;       //dst Top left
    dstQuad[0].y = 0;
    dstQuad[1].x = src->width-1;  //dst Top right
    dstQuad[1].y = 0;
    dstQuad[2].x = 0;     //dst Bottom left
    dstQuad[2].y = src->height-1;      
    dstQuad[3].x = src->width-1;  //dst Bot right
    dstQuad[3].y = src->height-1;

    // get transformation matrix that you can use to calculate 
    //coordinates of point Pxy  
    cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);
    // perspective transformation
    cvWarpPerspective(src,dst,warp_matrix);


    cvNamedWindow( "cvWarpPerspective", 1 );
    cvShowImage( "cvWarpPerspective", dst );

    cvWaitKey(0);

    cvReleaseMat(&warp_matrix);

    cvReleaseImage(&src);
    cvReleaseImage(&dst);

    cvDestroyAllWindows();
    return 0;