码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 利用三次样条插值调整鱼眼扭曲程度


             本文利用三次样条插值算法,改变鱼眼扭曲程度。效果如下图所示:

    源码下载地址:利用三次样条插值算法更改鱼眼特效的扭曲程度资源-CSDN文库

    (说明:源码基于QT和opencv )

    主要代码

    鱼眼扭曲

    1. void fisheye(const Mat &src, Mat &dst)
    2. {
    3. dst.create(src.rows, src.cols, CV_8UC3);
    4. dst.setTo(0);
    5. if (srcX.size() == 0 || srcX.size() != dstY.size() || cubicCoeffs == nullptr)
    6. return;
    7. Point2f center;
    8. center.x = src.cols / 2.0;
    9. center.y = src.rows / 2.0;
    10. double rr = sqrt(center.x * center.x + center.y * center.y);
    11. for (int id = 1; id < src.rows - 1; id++) {
    12. for (int jd = 1; jd < src.cols - 1; jd++) {
    13. double xd = 1.0 * (jd - center.x) / rr;//nomalize to -1 --- 1
    14. double yd = 1.0 * (id - center.y) / rr;
    15. double rd = sqrt(xd * xd + yd * yd);
    16. double phid = atan2(yd, xd);
    17. //double xs = asin(rd) * 2 / PI * cos(phid) * rr * sqrt(2);
    18. //double ys = asin(rd) * 2 / PI * sin(phid) * rr * sqrt(2);
    19. double nr = 0;
    20. if (rd>0 && rd <= 1)
    21. cubicSpline.cubicSplineInterpolation2(cubicCoeffs, srcX, rd, nr);
    22. double xs = nr * cos(phid) * rr * sqrt(2);
    23. double ys = nr * sin(phid) * rr * sqrt(2);
    24. int is = round(ys + center.y);
    25. int js = round(xs + center.x);
    26. if (is > dst.rows - 1 || is < 1 || js>dst.cols - 1 || js < 1){
    27. //is = id;
    28. //js = jd;
    29. }
    30. else{
    31. dst.at<Vec3b>(id, jd)[0] = src.at<Vec3b>(is, js)[0];
    32. dst.at<Vec3b>(id, jd)[1] = src.at<Vec3b>(is, js)[1];
    33. dst.at<Vec3b>(id, jd)[2] = src.at<Vec3b>(is, js)[2];
    34. }
    35. }
    36. }
    37. }

    其中cubicSpline.cubicSplineInterpolation2是调用三次样条插值函数计算某点的对应值,详情可查看源码。

    三次样条插值算法

    可以查看以下博文:

    三次样条插值icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/134171633插值初始化如下:

    1. vector<double> dstY;
    2. vector<double> srcX;
    3. //srcX(not change after initialize)
    4. srcX.push_back(0.0f);
    5. srcX.push_back(0.2f);
    6. srcX.push_back(0.4f);
    7. srcX.push_back(0.6f);
    8. srcX.push_back(0.8f);
    9. srcX.push_back(1.0f);
    10. //dstY
    11. for (int i = 0;i < (int)srcX.size();i++)
    12. {
    13. float v = asin(srcX.at(i)) * 2 / PI;
    14. if (v > 1.0f)
    15. v = 1.0f;
    16. }

    将图片压缩成圆形

    通过点击转化成圆形按钮可实现将图片转化成圆形:

  • 相关阅读:
    【Transformer系列】深入浅出理解ViT(Vision Transformer)网络模型
    【黑猩猩算法】基于加权反对技术和贪婪搜索进化黑猩猩优化算法求解多模态工程问题附matlab代码
    Centos下部署CodiMD
    分析Python7个爬虫小案例(附源码)
    Http代理与socks5代理有何区别?如何选择?(一)
    C/C++,不废话的宏使用技巧
    找出一段英文文本中出现次数最多的10个单词
    MySQL学习笔记③
    Go语言常用命令详解(三)
    VMware云数据中心中常用的术语清单
  • 原文地址:https://blog.csdn.net/hulinhulin/article/details/134320727
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号