图片柱面投影简单实现

article/2025/9/27 4:59:52

转自:https://blog.csdn.net/u010551600/article/details/78461142

柱面投影是图片拼接的前期的一部分工作,以下代码只是简单的实现了投影,还可以优化,

柱面半径设置位图片宽度的一半,即 R = width/2

代码运算流程是 对于dst图片上的每一个像素点,通过公式计算出src上对应的位置(hnum,wnum),把src上这个位置的像素值赋值给dst。
 

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;/*
实现一个简单的图像投影实例,
算法根据csdn博客http://blog.csdn.net/weixinhum/article/details/50611750
该代码对目录下的test图片进行柱面投影
*/
int main()
{Mat src = imread("test.jpg");Mat dst(src.rows,src.cols,src.type());int width = src.cols, height = src.rows;double x, y;double R = width / 2;int drcpoint;for (int hnum = 0; hnum < height;hnum++){for (int wnum = 0; wnum < width;wnum++){double k = R / sqrt(R*R + (wnum - width / 2)*(wnum - width / 2));x = (wnum - width / 2) / k + width / 2;y = (hnum - height / 2) / k + height / 2;if (0 < x && x < width && 0 < y &&y < height){dst.at<Vec3b>(hnum, wnum) = src.at<Vec3b>(int(y), int(x));}}}imshow("origin Image",src);imshow("柱面投影图",dst);waitKey(0);return 0;
}

运行结果:

算法思想参考:http://blog.csdn.net/weixinhum/article/details/50611750

图像的柱面投影算法,在360°环形全景应用中几乎一定会用到。而为何要用该算法,可以参考下图:


    从图像中可以看到,該环形全景设备由八个摄像头环形排列而成(需注意环形全景的形态并不固定,摄像头的个数不一定是八个,甚至只有一个摄像头在一直匀速转圈也是可以的)。每个摄像头所拍摄的画面为其前方的实线段区域,为了之后能进行图像的拼接,相邻摄像头之间必须要有图像的重合区域,如上图的红色线段部分(如果能保证刚刚好相接也可以,不过结构难度太高)。

    从不同摄像头的重合区域可以看到,由于摄像头的朝向不同,重合部分图像中的物体并不满足视觉一致性的要求,因此需要将图像进行投影,使其满足图像的一致性要求,为后面的拼接做准备(视觉一致性是全景应用最为关键的问题,无论是柱环形全景还是球形全景,都无法避免,只是所选的投影模型不同罢了)。在环形全景中,一般选择柱面投影算法,将图像分别投影到以 像素焦距+摄像头与圆心距离 为半径的圆柱上。投影后的图像为上图摄像头前方的圆弧。从圆弧上看,图像的重合部分已经满足视觉一致性的要求,可以做拼接。而如何去投影就是本文要介绍的。

    柱面投影的数学模型相对比较简单,把观测点定在圆柱体的中心,图像的像素焦距+摄像头与圆心距离 为圆柱体的半径,则摄像头所拍摄的图像与圆柱体相切。图像上的一点Q与观测点连线,该连线与圆柱面的交点点Q'为图像点Q在柱面上的投影,我们需要做的就是求出点Q(x,y)与点Q'(x',y')之间的换算关系。先看看下图:


    该图的实线部分为投影模型的俯视图,下方的线段a为待投影的图像,圆为圆柱切面,O为观测点。而虚线部分为Y轴方向上的辅助线。现在设A为图像上的任意一点,其坐标为(x,y,z),其中z=-R,则其在x-z坐标系上的投影A'的坐标为(x,-R)。B为我们要求的点A在圆柱面上的投影点,其坐标为(x',y',z'),则其在x-z坐标系上的投影点B'的坐标为(x',z')。

    由于△0BB'与△OAA'相似,△0B'F与△OA'G相似

    则有BB'=kAA',B'F=kA'G,OF=kR(k<1)

    则kx=x',ky=y'

    又OF²+B'F²=R²

    故k²R²+k²x²=R²

    

    又x'=kx,y'=ky

    故

    

    

    由于一般来说图像以左上角为坐标原点,而上面公式中的坐标系以图像的中心为坐标原点,所以在实际图像的计算中,上面的计算公式换为

    

    

    有了上面的公式,便可计算出图像的柱面投影结果。这里需要注意的是我们把x和y写在了等式的左边而x',y'写在了右边,这样做是为了方便我们后面进行插值计算。为什么要这么做可以看下面两张图片

 

    左边图像为待投影图像,右边为直接投影的结果,由于投影后的图像点坐标未必为整数,而图像的坐标需要为整数,所以必将造成误差。表现在右边图像上就是图像有很多显而易见的毛刺。而我们进行双线性插值之后的投影图像如下


    可以看到,其毛刺得到了一定的抑制。上面的图像还说明了经过柱面投影的图像会比原来的图像宽度小,具体小多少跟R有关,由于比较简单,在这里不再给出推导的过程。以上投影过程的主要代码如下
 

void DealWithImgData(BYTE *srcdata, BYTE *drcdata,int width,int height)//参数一为原图像的数据区首指针,参数二为投影后图像的数据区首指针,参数三为图像的宽,参数四为图像的高
{//双线性插值算法int i_original_img_hnum, i_original_img_wnum;//目标点坐标double distance_to_a_y, distance_to_a_x;//在原图像中与a点的水平距离  int original_point_a, original_point_b, original_point_c, original_point_d;int l_width = WIDTHBYTES(width* 24);//计算位图的实际宽度并确保它为4byte的倍数int drcpoint;double R = 1200;//像素距离double x, y;for (int hnum = 0; hnum < height; hnum++){for (int wnum = 0; wnum < width; wnum++){drcpoint = l_width*hnum + wnum * 3;//数组位置偏移量,对应于图像的各像素点RGB的起点//柱面投影double k = R / sqrt(R*R + (wnum- width / 2) * (wnum - width / 2));x = (wnum - width / 2) / k + width / 2;y = (hnum - height / 2) / k + height / 2;if (x >= 0 && y >= 0 && x < width && y < height){/***********双线性插值算法***********/i_original_img_hnum = y;i_original_img_wnum = x;distance_to_a_y = y - i_original_img_hnum;distance_to_a_x = x - i_original_img_wnum;//在原图像中与a点的垂直距离  original_point_a = i_original_img_hnum*l_width + i_original_img_wnum * 3;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点A    original_point_b = original_point_a + 3;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点B  original_point_c = original_point_a + l_width;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点C   original_point_d = original_point_c + 3;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点D  if (i_original_img_hnum == height - 1){original_point_c = original_point_a;original_point_d = original_point_b;}if (i_original_img_wnum == width - 1){original_point_a = original_point_b;original_point_c = original_point_d;}drcdata[drcpoint + 0] =srcdata[original_point_a + 0] * (1 - distance_to_a_x)*(1 - distance_to_a_y) +srcdata[original_point_b + 0] * distance_to_a_x*(1 - distance_to_a_y) +srcdata[original_point_c + 0] * distance_to_a_y*(1 - distance_to_a_x) +srcdata[original_point_c + 0] * distance_to_a_y*distance_to_a_x;drcdata[drcpoint + 1] =srcdata[original_point_a + 1] * (1 - distance_to_a_x)*(1 - distance_to_a_y) +srcdata[original_point_b + 1] * distance_to_a_x*(1 - distance_to_a_y) +srcdata[original_point_c + 1] * distance_to_a_y*(1 - distance_to_a_x) +srcdata[original_point_c + 1] * distance_to_a_y*distance_to_a_x;drcdata[drcpoint + 2] =srcdata[original_point_a + 2] * (1 - distance_to_a_x)*(1 - distance_to_a_y) +srcdata[original_point_b + 2] * distance_to_a_x*(1 - distance_to_a_y) +srcdata[original_point_c + 2] * distance_to_a_y*(1 - distance_to_a_x) +srcdata[original_point_c + 2] * distance_to_a_y*distance_to_a_x;/***********双线性插值算法***********/}}}
}

完结。


http://chatgpt.dhexx.cn/article/3dnNwqRK.shtml

相关文章

柱面投影

做全景拼接时需要将图像统一到一个视角里&#xff0c;常用的柱面投影&#xff0c;其基本原理及公式如下&#xff08;原文&#xff09;。 【Octave】柱面投影简析 我是分割线 在做全景拼接的时候&#xff0c;为了保持图片中的空间约束与视觉的一致性&#xff0c;需要做一定的预…

图像柱面投影

由于图像序列是实体景物在不同坐标系下的二维投影&#xff0c;直接对拍摄图像进行拼接无法满足视觉一致性&#xff0c;所以需要将待拼接的图像分别投影到一个标准的坐标系下&#xff0c;然后再进行图像的拼接。全景图生成系统可以采用圆柱体、立方体和球体等模型来实现。由于柱…

柱面投影介绍与python实现(一)

简介 本文主要介绍柱面投影变换,将这种变换用于图像处理,可以产生图像扭曲的效果,如下图所示,产生了将平面图像投影到了柱面上的视觉效果。博客最后给出了柱面投影的python实现,供读者参考。 数学原理 如下图所示,矩形GHEF为待处理的原图,投影到柱面上之后则变成了…

【Octave】柱面投影简析

我是分割线 在做全景拼接的时候&#xff0c;为了保持图片中的空间约束与视觉的一致性&#xff0c;需要做一定的预处理&#xff0c;可以是球面投影&#xff0c;柱面投影等。 如果仅仅是做水平方向的拼接&#xff0c;则做柱状投影就好了 一. 原理 把平面图像投影到圆柱的曲面上。…

拖库 洗库 撞库

间接转载地址: http://blog.csdn.net/daliaojie/article/details/42171177 一,背景: 用户数据泄露一直是如今互联网世界的一个焦点,从最近的京东撞库抹黑事件,到之前的CSDN,如家用户数据的泄露,服务商和黑客之间在用户数据这个舞台上一直在进行着旷日持久的攻防战。 对于…

分享一个验证码暴力撞库漏洞的案例

记录一个验证码暴力破解的案例&#xff0c;安全问题不容忽视呀。 某公司接到用户反馈&#xff0c;应用存在安全漏洞&#xff0c;通过技术手段可以在无手机情况下&#xff0c;获取验证码&#xff0c;直接修改密码成功。如果用户密码被他人修改成功&#xff0c;直接涉及到资产损…

深入浅出了解撞库攻击!

1. 撞库的原理和危害 “撞库”&#xff08;Credential Stuffing Attack&#xff09;在网络安全中是一个古老的概念&#xff0c;按中文的字面意思解读&#xff0c;就是“碰撞数据库”的意思。“碰撞”意味着碰运气&#xff0c;即不一定能成功&#xff1b;而“数据库”中往往存储…

使用 Burp Suite 暴力破解密码 撞库攻击 从0到1手摸手教学

说明 一个学习的过程 增加自己网络安全知识 切勿用于违法用途 设置密码尽量使用6位以上并规避简单数字组合、加强对同一ip的频繁访问次数限制、设置人机验证减小撞库攻击的危害 用到的工具&环境 本地环境 kali 2022 Burp Suite FireFox 靶机环境 一台服务器 CentO…

【htpwdScan 是一个HTTP暴力破解、撞库测试工具。】

htpwdScan 1.0 htpwdScan 是一个HTTP暴力破解、撞库测试工具。 安装 要求 python3.6 pip3 install requirements.txt特性 支持常见的认证模式&#xff1a;Basic/Digest/NTLM 等 支持对 GET / POST 参数进行暴力破解&#xff0c;支持使用占位符选定参数或参数的一部分 支持批…

MD5碰撞与撞库和题

MD5 相同的情况叫做“碰撞”&#xff0c;现在网络中已经出现了两个相同的 MD5 可执行文件&#xff0c;所以MD5现在已经被弃用了&#xff0c;发生碰撞的概率是1/&#xff08;2^128&#xff09;。 SHA-1 也会发生碰撞&#xff0c;但是几率比 MD5 小的多。 2004年&#xff0c;我…

拖库 洗库 撞库的概念

一&#xff0c;背景&#xff1a; 用户数据泄露一直是如今互联网世界的一个焦点&#xff0c;从最近的京东撞库抹黑事件&#xff0c;到之前的CSDN&#xff0c;如家用户数据的泄露&#xff0c;服务商和黑客之间在用户数据这个舞台上一直在进行着旷日持久的攻防战。 对于大多数用…

(云安全)拖库-洗库-撞库

一&#xff0c;背景&#xff1a; 用户数据泄露一直是如今互联网世界的一个焦点&#xff0c;从最近的京东撞库抹黑事件&#xff0c;到之前的CSDN&#xff0c;如家用户数据的泄露&#xff0c;服务商和黑客之间在用户数据这个舞台上一直在进行着旷日持久的攻防战。 对于大多数用户…

java解决撞库的问题_Web安全开发之验证码设计不当引发的撞库问题

感谢某电商平台安全工程师feiyu跟我一起讨论这个漏洞的修复。以往在安全测试的过程中后台经常存在验证码不失效果造成的撞库问题&#xff0c;甚至在一些银行或者电商的登录与查存页面同样存在这个问题&#xff0c;一旦造成撞库无论对用户账号的安全性还是网站的负载都是巨大的挑…

什么是撞库攻击,如何预防撞库攻击?

1. 撞库的原理和危害 “撞库”&#xff08;Credential Stuffing Attack&#xff09;在网络安全中是一个古老的概念&#xff0c;按中文的字面意思解读&#xff0c;就是“碰撞数据库”的意思。“碰撞”意味着碰运气&#xff0c;即不一定能成功&#xff1b;而“数据库”中往往存储…

撞库详解

撞库攻击是如今最常见的攻击&#xff0c;给企业带来巨大威胁。撞库带来的威胁往往不是直接的&#xff0c;但是由此造成的信息泄露以及进一步的渗透与攻击会更为严重。Akamai的报告显示&#xff0c;2018年五月到十二月期间&#xff0c;共发生了约280亿次撞库攻击&#xff0c;其中…

mysql暴力撞库与弱密码检测

暴力撞库与弱密码检测 最近在生产数据库上碰到了一个问题&#xff0c;觉得挺有意思&#xff0c;总结出来和大家分享下。 关于暴力撞库和弱密码检测。 相信使用数据库的大家应该都不陌生&#xff0c;暴力撞库&#xff0c;简单通俗的讲通过一堆生成的密码&#xff0c;然后用默认…

倾家荡产、隐私全无?独家揭秘撞库攻击!

1. 撞库的原理和危害 “撞库”&#xff08;Credential Stuffing Attack&#xff09;在网络安全中是一个古老的概念&#xff0c;按中文的字面意思解读&#xff0c;就是“碰撞数据库”的意思。“碰撞”意味着碰运气&#xff0c;即不一定能成功&#xff1b;而“数据库”中往往存储…

撞库是什么

撞库&#xff08;Credential Stuffing&#xff09;是黑客通过收集互联网已泄露的用户和密码信息&#xff0c;生成对应的字典表&#xff0c;尝试批量登录其他网站后&#xff0c;得到一系列可以登录的用户。很多用户在不同网站使用的是相同的帐号密码&#xff0c;因此黑客可以通过…

什么是撞库及撞库攻击的基本原理

6月26日晚&#xff0c;我国大型聊天软件QQ出现了大规模盗号情况&#xff0c;而且是在QQ号本人在线时出现了被盗情况。 6月27日中午&#xff0c;腾讯QQ发布声明称&#xff1a;6月26日晚上10点左右&#xff0c;收到部分用户反馈QQ号码被盗。QQ安全团队高度重视并立即展开调查&am…

企业微信如何关联小程序?

我们在日常使用微信时&#xff0c;经常会用到小程序功能&#xff0c;直接从微信中打开第三方页面&#xff0c;很是方便&#xff0c;那么自从企业微信与微信打通之后&#xff0c;我们该如何将小程序与企业微信联系起来使用呢&#xff1f; 其实&#xff0c;在企业微信中&#xf…