投影变换原理和用法

article/2025/10/1 17:41:42

一、定义:投影变换也叫透射变换、投影映射。透射变换是将图像投影到一个新的视平面,是一种二维坐标到三维坐标的变换。
透射变换是仿射变换的延续,也可以说仿射变换是透射变换的一种特殊形式。其特殊性在于变换后图像的形状仍然维持原状。投影变换包括的情况很多,有可能变换前后图像的形状发生了很大的改变,如对边不再平行,或者发生了透视畸变,这时可以使用投影变换使其恢复原状。其步骤与仿射变换类似,首先计算投影变换矩阵,然后计算投影变换参数,最后将投影变换矩阵映射到对象上。
二、算子
2.1根据给定点的投影计算一个同质变换矩阵
hom_vector_to_proj_hom_mat2d( : : Px, Py, Pw, Qx, Qy, Qw, Method : HomMat2D)

    Px:输入参数,图像变换前图像的顶点x坐标。Py:输入参数,图像变换前图像的顶点y坐标。Pw:输入参数,图像变换前图像的顶点w坐标。Qx:输入参数,图像变换后图像的顶点x坐标。Qy:输入参数,图像变换后图像的顶点y坐标。Qw:输入参数,图像变换后图像的顶点w坐标。Method:输入参数,变换方式选择。默认'normalized_dlt',

列表

'dlt’算法最快速简单,但是有相对的不准确的误差
'normalized_dlt’速度与精度较好
】。
HomMat2D:输出参数,输出齐次投影变换矩阵。

2.2根据给定点的投影计算一个投影变换矩阵
vector_to_proj_hom_mat2d( : : Px, Py, Qx, Qy, Method, CovXX1, CovYY1, CovXY1, CovXX2, CovYY2, CovXY2 : HomMat2D, Covariance)

    Px:输入参数,图像变换前图像的顶点x坐标。Py:输入参数,图像变换前图像的顶点y坐标。Qx:输入参数,图像变换后图像的顶点x坐标。Qy:输入参数,图像变换后图像的顶点y坐标。Method:输入参数,变换方式选择。默认 'normalized_dlt',

列表

'dlt’算法最快速简单,但是有相对的不准确的误差
'gold_standard’优化较好但速度较慢
'normalized_dlt’速度与精度较好

    CovXX1:输入参数,图像变换前图像对应x值坐标的row方向的变动。默认[]。CovYY1:输入参数,图像变换前图像对应y值坐标的col方向的变动。默认[]。CovXY1:输入参数,图像变换前图像对应点的协方差。默认[]。CovXX2:输入参数,图像变换后图像对应x值坐标的row方向的变动。默认[]。CovYY2:输入参数,图像变换后图像对应y值坐标的col方向的变动。默认[]。CovXY2:输入参数,图像变换后图像对应点的协方差。默认[]。HomMat2D:输出参数,输出映射变换矩阵。Covariance:输出参数,输出9×9协方差矩阵的投影变换矩阵。Filters / Geometric Transformations

2.3对图像应用投影变换
projective_trans_image(Image : TransImage : HomMat2D, Interpolation, AdaptImageSize, TransformDomain : )

    Image:输入参数,输入需要变换的多通道图像。TransImage:输出参数,输出变换后的图像。HomMat2D:输入参数,输入变换矩阵。Interpolation:输入参数,插值的方式。默认 'bilinear',列表【 'bilinear', 'nearest_neighbor'】。AdaptImageSize:输入参数,是否自动调整输出图像的大小。默认'false',列表【'false', 'true'】。TransformDomain:输入参数,输入图像的域也应该进行变换吗?。默认'false',列表【'false', 'true'】。Regions / Geometric Transformations

2.4对区域应用投影变换
projective_trans_region(Regions : TransRegions : HomMat2D, Interpolation : )

    Regions:输入参数,输入区域。TransRegions:输出参数,输出变换后的区域。HomMat2D:输入参数,输入映射变换矩阵。Interpolation:输入参数,插值的方式。默认 'bilinear',列表【 'bilinear', 'nearest_neighbor'】。

三、代码应用

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('C:/Users/Dell/Desktop/投影变换', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])threshold (Image, Regions, 95, 255)fill_up (Regions, RegionFillUp)opening_rectangle1 (RegionFillUp, RegionOpening, 5, 5)connection (RegionOpening, ConnectedRegions)select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 80225.1, 220096)closing_circle (SelectedRegions, RegionClosing, 15)*提取矩形XLD轮廓gen_contour_region_xld (RegionClosing, Contours, 'border')*分割XLD轮廓,并排序。(第一次排序按照行,第二次排序按照列。这样可以有顺序的提取矩形的四条边。)segment_contours_xld (Contours, ContoursSplit, 'lines', 5, 10, 2)sort_contours_xld (ContoursSplit, SortedContours, 'upper_left', 'true', 'row')sort_contours_xld (ContoursSplit, SortedContours1, 'upper_left', 'true', 'column')*分别把行列的的XLD拟合成直线gen_empty_obj (Hline)select_obj (SortedContours, ObjectSelected, 1)select_obj (SortedContours, ObjectSelected1, 4)concat_obj (Hline, ObjectSelected, Hline)concat_obj (Hline, ObjectSelected1, Hline)gen_empty_obj (Vline)select_obj (SortedContours1, ObjectSelected2, 1)select_obj (SortedContours1, ObjectSelected3, 4)concat_obj (Vline, ObjectSelected2, Vline)concat_obj (Vline, ObjectSelected3, Vline)fit_line_contour_xld (Hline, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)gen_region_line (RegionLines, RowBegin, ColBegin, RowEnd, ColEnd)fit_line_contour_xld (Vline, 'tukey', -1, 0, 5, 2, RowBegin1, ColBegin1, RowEnd1, ColEnd1, Nr1, Nc1, Dist1)gen_region_line (RegionLines1, RowBegin1, ColBegin1, RowEnd1, ColEnd1)*计算矩形四个角点坐标(左上,右上,右下,左下)intersection_lines (RowBegin[0], ColBegin[0], RowEnd[0], ColEnd[0], RowBegin1[0], ColBegin1[0], RowEnd1[0], ColEnd1[0], Row, Column, IsOverlapping)intersection_lines (RowBegin[0], ColBegin[0], RowEnd[0], ColEnd[0], RowBegin1[1], ColBegin1[1], RowEnd1[1], ColEnd1[1], Row1, Column1, IsOverlapping1)intersection_lines (RowBegin[1], ColBegin[1], RowEnd[1], ColEnd[1], RowBegin1[1], ColBegin1[1], RowEnd1[1], ColEnd1[1], Row2, Column2, IsOverlapping2)intersection_lines (RowBegin[1], ColBegin[1], RowEnd[1], ColEnd[1], RowBegin1[0], ColBegin1[0], RowEnd1[0], ColEnd1[0], Row3, Column3, IsOverlapping3)gen_cross_contour_xld (Cross, Row, Column, 22, 0.785398)gen_cross_contour_xld (Cross1, Row1, Column1, 22, 0.785398)gen_cross_contour_xld (Cross2, Row2, Column2, 22, 0.785398)gen_cross_contour_xld (Cross3, Row3, Column3, 22, 0.785398)*投影变换前的坐标originalRow:=[Row,Row1,Row2,Row3]originalColumn:=[Column,Column1,Column2,Column3]*计算原图矩形区域最宽和最高参数distance_pp (Row, Column, Row1, Column1, Width1)distance_pp (Row2, Column2, Row3, Column3, Width2)tuple_max2 (Width1, Width2, WidthMax)distance_pp (Row, Column, Row3, Column3, Height1)distance_pp (Row1, Column1, Row2, Column2, Height2)tuple_max2 (Height1, Height2, HeightMax)*1种投影变换方式*投影变换后的坐标(利用矩形最宽的边和最高的边长度,分别生成4个顶点坐标。*优点是整图做投影变换,整幅图像的倾斜都会被校正。缺点是,投影变换过程中可能会导致一些区域跑出了图像外,结果图像相对于原图,这些变换导致的图像外区域会缺失)projectionRow:=[Row, Row, Row+HeightMax,Row+HeightMax]projectionColumn:=[Column, Column+WidthMax,Column+WidthMax, Column]*生成投影变换矩阵,并做投影变换,校正图像hom_vector_to_proj_hom_mat2d (originalRow, originalColumn, [1,1,1,1], projectionRow, projectionColumn, [1,1,1,1], 'normalized_dlt', HomMat2D)projective_trans_image (Image, Image_rectified, HomMat2D, 'bilinear', 'false', 'false')dev_display (Image)dev_display (Image_rectified)write_image (Image_rectified, 'png', 0, 'C:/Users/Dell/Desktop/投影变换/新建文件夹/'+Index+'0.png')*2种投影变换方式*投影变换后的坐标(利用矩形最宽的边和最高的边长度,分别生成4个顶点坐标。图像变换后,以左上原点(0,0)为基准,依次赋值各顶点坐标。*优点是被提取的区域变换到图像坐标系左上角,区域不会缺失。缺点是除了被提取区域外,其余区域可能会缺失。)projectionRow1:=[0, 0, HeightMax,HeightMax]projectionColumn1:=[0, WidthMax,WidthMax, 0]*生成投影变换矩阵,并做投影变换,校正图像hom_vector_to_proj_hom_mat2d (originalRow, originalColumn, [1,1,1,1], projectionRow1, projectionColumn1, [1,1,1,1], 'normalized_dlt', HomMat2D1)projective_trans_image (Image, Image_rectified1, HomMat2D1, 'bilinear', 'false', 'false')dev_display (Image)dev_display (Image_rectified1)write_image (Image_rectified1, 'png', 0, 'C:/Users/Dell/Desktop/投影变换/新建文件夹/'+Index+'1.png')stop()
endfor

原图1
在这里插入图片描述
第1种投影变换结果图
在这里插入图片描述
第2种投影变换结果图
在这里插入图片描述
原图2
在这里插入图片描述
第1种投影变换结果图
在这里插入图片描述
第2种投影变换结果图
在这里插入图片描述
原图3
在这里插入图片描述
第1种投影变换结果图
在这里插入图片描述
第2种投影变换结果图
在这里插入图片描述


http://chatgpt.dhexx.cn/article/1Y6rKHFY.shtml

相关文章

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。

MFC调用vlc动态库libvlc.dll实现简单播放器 中文路径处理

一、简单说明 本文讲解利用MFC调用vlc&#xff08;2.0.0&#xff09;的动态库实现简单的播放器&#xff0c;实现播放、暂停、停止、音量控制、进度控制&#xff0c;支持中文路径等。 VLC 中文路径转码问题<转> 最近用MFC编写调用libVLC的程序时碰到中文路径不能打开的问题…

VLC-Android编译

1.环境 硬核条件----------linux(这里用ubuntu代替)15.5.1 build-15018445 PS&#xff1a;这里安装好虚拟机以后&#xff0c;尽可能分配大内存(8GB起步)&#xff0c;如果电脑本地不允许开这么大的内存给虚拟机&#xff0c;则本博文后面的内容可能帮助不大。 安装好虚拟机后&am…

VLC介绍以及库的使用

VLC原指VideoLAN客户端(VideoLANClient)&#xff0c;是一款开源的、跨平台的、可扩展的、多媒体播放器、流媒体服务器及框架&#xff0c;可播放大多数多媒体文件&#xff0c;以及DVD、音频CD、VCD及各类流媒体协议&#xff0c;现更名为VLC media player&#xff0c;最新版本为2…

LibVLC —— 常用函数解析

函数 ● LIBVLC_API libvlc_instance_t *libvlc_new( int argc , const char *const *argv ); 功能&#xff1a;创建libvlc_instance_t对象。 用法&#xff1a; libvlc_instance_t *VlcInstance libvlc_new(0, nullptr);参数&#xff1a;                具体…

【玩转VLC】--- 基于libvlc写个最简单的播放器

通过【玩转VLC】--- ubuntu下编译vlc 我们已经把vlc编译哦了。生成了一系列的bin和libvlc.so. 接下来我们就用编译好的libvlc.so搞一个最简单的播放器。 我认为vlc的伟大之处有一点就是他并没有把整个播放器写成一个硬生生的bin。而是独立出来个libvlc库&#xff0c;其他的玩…

最简单的基于libVLC的例子:最简单的基于libVLC的推流器

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…

C++调用libVLC播放视频

1、下载libVLC的sdk Index of /pub/videolan/vlc/ 注意下载.7z结尾的 2、Visual Studio建立C的windows控制台项目 3、文件准备 &#xff08;1&#xff09;sdk文件夹解压缩到项目文件夹下 &#xff08;2&#xff09;在Debug下方压缩包内的几个文件 、 4、配置项目属性 注意…

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版)

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…

基于libVLC的视频播放器之二:使用VLC-Qt播放RTSP流

此篇是 使用VLC浏览器插件播放RTSP流的姊妹篇。 一.直接使用libVLC libVLC是VLC media player多媒体框架的核心引擎和接口&#xff0c;开发者使用它能轻松的创建大量具有VLC特性的应用。 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器详细介绍了libVL…

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…

用VLC开发视频播放器/组件(两种方式:libVLC / VLC-Qt)

测试环境 MSVC-2015Qt 5.14.2QCreator 1. libVLC&#xff08;关键步骤&#xff09; 参考&#xff1a;心流剑 libVLC 各版本 下载链接 我的下载版本为&#xff1a;3.0.11 sdk/lib文件夹目录 qmake vlc 部分的配置&#xff08;路径根据自己的修改&#xff09;只需要&#…

idea如何取消debug所有断点

1、debug模式下&#xff0c;在idea左下方找到【View Breakpoints】按钮或者直接按【CtrlShiftF8】快捷键&#xff0c;如下图&#xff1a; 2、在左侧窗口中&#xff0c;点击【Java Line Breakpoints】前方的全选框&#xff0c;如下图&#xff1a; 3、取消 【Java Line Breakp…

Idea断点for循环调试

前言 作为一个开发&#xff0c;最高兴和痛苦的事情就是排查问题&#xff0c;调试代码解决问题&#xff0c;掌握一些技巧可以提升效率&#xff0c;今天就讲讲for循环断点调试的技巧for循环断点调试 操作步骤&#xff1a; 1.在断点调试处加断点 2.点击断点处&#xff0c;鼠标右击…

IntelliJ IDEA-Debug断点调试 看这篇文章就够了

详解IntelliJ IDEA-Debug断点调试 如今&#xff0c;IntelliJ IDEA 目前深受广大开发者喜爱&#xff0c;我们在实际开发工作中&#xff0c;不管是用来阅读源码还是在开发过程中都需要进行代码调试。 以下为大家准备了一篇关于IntelliJ IDEA-Debug断点调试的文章&#xff0c;如…

IDEA 的基本介绍使用及断点调试

文章目录 1、IDE&#xff08;集成开发环境&#xff09;- IDEA2、IDE&#xff08;集成开发环境&#xff09;- Eclipse3、IDEA 的基本介绍和使用3.1、设置字体 和 颜色主题3.2、编译文件和源代码3.3、IDEA 常用快捷键3.4、模板/自定义模板 4、断点调试(debug)4.1、实际需求4.2、定…

idea debug调式进不了断点

问题&#xff1a; 在启动debug断点调试时&#xff0c;代码无法进入断点。 解决方案&#xff1a; 在网上搜索解决方案&#xff0c;看到说在settings——>Debugger下勾选如下位置即可。本人并未亲自测试&#xff0c;所以就做了一波搜集党。 我的解决方法&#xff1a;去掉如下…

idea断点调试jar包

本文以springbootdemo-0.0.1-SNAPSHOT.jar 为例&#xff0c;jar内容需与idea保持一致。 1、启动命令 常规jar启动&#xff1a;java -jar springbootdemo-0.0.1-SNAPSHOT.jar jar包断点调试启动&#xff1a;java -Xdebug -agentlib:jdwptransportdt_socket,servery,suspendn,ad…

如何在idea中打debug断点

在调试代码的时候&#xff0c;你的项目得debug模式启动&#xff0c;也就是点那个绿色的甲虫启动服务器&#xff0c;然后&#xff0c;就可以在代码里面断点调试啦。 下面不要在意&#xff0c;这个快捷键具体是啥&#xff0c;因为&#xff0c;这个keymap是可以自己配置的&#xf…

【IDEA 断点调试】

IDEA 断点调试 断点类型 行断点 【红色圆点】 点击左侧空白区域 、或 在行上ctrlF8 详细断点 【黄色圆点】 shift单击左侧空白区域&#xff0c;同时弹窗选择断点详细设置 方法断点 【红色菱形】 点击方法名所在左侧空白区域 。 进入方法后每一行都是挂起&#xff0c;打在接口…