Learn Opencv ---- 使用Opencv构建哈哈镜

这篇博客介绍了如何利用Opencv和Python构建哈哈镜效果,通过创建虚拟相机、定义三维曲面并进行图像重映射。文章深入浅出地探讨了图像形成理论,包括投影矩阵和相机内外参数,以及如何利用vcam库简化实现过程。
摘要由CSDN通过智能技术生成

阅读原文

前言

    在童年时期,有一个东西时常能给我带来欢乐,那就是哈哈镜。哈哈镜不是传统的平面镜,而是凹凸不平的镜面。当人们来到镜子面前时,镜子中的自己会发生奇怪的扭曲,带来欢笑声。
    这篇博文的主要动机是鼓励读者去学习相机的内外参数,相机的投影矩阵以及如何使用几何来表现图像。
    通过这篇文章,我希望读者能够了解到一个事实,那就是如果想要创建一个有趣的东西,必须要有相对应的明确的概念和理论。

形成图像的理论

    简单来说,一张图像其实是一个三维世界场景的二维投影。而要将无数个三维点进行投影,需要使用下述公式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
    其中, P P P为相机的投影矩阵, X w , Y w , Z w X_w,Y_w,Z_w Xw,Yw,Zw为三维空间的点坐标, u , v u,v u,v为二维空间的像素坐标。

如何实现

    整个哈哈镜项目主要分为三个步骤:

  1. 创建虚拟摄像机
  2. 定义一个三维曲面(镜面),并使用合适的投影矩阵将该曲面投影到虚拟相机当中。
  3. 将三维曲面投影点的图像坐标应用于图像网格的扭曲,以获得哈哈镜的效果。

    整个步骤如下图所示。
在这里插入图片描述
图1: 创建哈哈镜的步骤图。第一步,创建三维曲面(左图);第二步,使用虚拟相机捕获平面,得到对应的二维点(中图);第三步,将得到的二维点应用到网格变形,得到最终的效果(右图)。
    如果大伙暂时还未理解,别担心,后面会详细解释每一步。

创建虚拟相机

    从上述的介绍可以知道一个三维点是如何使用投影矩阵然后得到二维坐标点的。现在让我们了解一下虚拟相机的含义,以及如何使用这个虚拟相机来拍摄图像。
    虚拟相机的本质是投影矩阵 P P P,因为它告诉我们3D世界坐标和响应的图像像素坐标之间的关系。我们知道,一个投影矩阵是由相机内参矩阵( K K K)和相机外参( M 1 M_1 M1)矩阵组成。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误表示编译器无法找到名为“opencv.hpp”的文件。这通常是因为您的编译器无法找到OpenCV库的路径。解决此问题的方法如下: 1. 确认您已经正确安装了OpenCV库,并且已经将其路径添加到了编译器的路径中。 2. 确认您的代码中包含了正确的头文件路径。例如,如果您的OpenCV库安装在“C:\opencv”下,则您的代码中应该包含以下语句: #include "C:\opencv\opencv2\opencv.hpp" 3. 如果您使用的是Visual Studio等IDE,可以尝试手动添加OpenCV库的路径。具体方法如下: a. 在“项目属性”中打开“VC++目录”选项卡。 b. 在“包含目录”中添加OpenCV库的“include”文件夹路径,例如“C:\opencv\include”等。 c. 在“库目录”中添加OpenCV库的“lib”文件夹路径,例如“C:\opencv\lib”等。 d. 在“链接器”->“输入”中添加OpenCV库的名称,例如“opencv_world340.lib”等。 4. 如果您使用的是Linux或MacOS系统,可以尝试执行以下命令来安装OpenCV库: sudo apt-get install libopencv-dev 或者 brew install opencv 然后将OpenCV库的路径添加到编译器的路径中,例如: g++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgcodecs XDlgToolStandalone.cpp -o XDlgToolStandalone 注意:上述命令仅供参考,具体参数可能会因系统版本和OpenCV库版本而异。请根据您的实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值