zoukankan      html  css  js  c++  java
  • 如何实现两个人脸照片的变换

            相信想做你的code这个视频很多人都看过. 视频里, 男主角一直在编一个程序. 程序最后的效果是: 窗口里一个人的脸渐渐变成了另外一个人的脸...最后男主角很开心啊...

            今天突发奇想, 产生一个疑问, 那个程序究竟是如何实现的? 思考了几分钟, 思路是这样:

            假定有A, B两张照片(都是同一像素大小,都是200*200), 图片都是一个一个的像素组成.先不要说把整张图片进行变换了, 就先讨论图片的其中一个点. 比如想把A图片的(0, 0)坐标的像素分10步变到B图(0, 0)坐标的颜色. 假设A图(0, 0)坐标这个点的RGB是(20, 20, 20), B图(0, 0)坐标这个点的RGB是(40, 80, 120). 在屏幕的(0, 0)坐标输出A图(0, 0)的原始RGB, 然后一步一步的变换, 每次变换R值增加2, G值增加6, B值增加10. 最后经过十次变换后, 图片A的点(0, 0)的颜色就变换成了B图点(0, 0)的颜色.

            这是假设的一个点, 对图片A的每个点进行变换的话, 可以做一个双重的for循环, 像这两个图片都是200*200像素的, 就这样写for循环:

    int i, j;
    for(i = 0; i < 200; i ++)
        for(j = 0; j < 200; j ++)
    {
         // 对[i][j]坐标的颜色进行变换
    }

            经过这样的循环, 理论上最后图片是变换成功了. 但是现实的效果是十分滑铁卢的.

            仅仅写了一个在for循环中把图片每个像素输出来, 运行起来就花费了很长很长很长很长时间...就更别提图片中每个像素的RGB值的增加变化然后再输出了... 我知道这个for循环计算量是十分十分十分大的...所以显示效果十分十分十分的挫...

    using (Bitmap bmp = new Bitmap(@"C:\xie.jpg"))
    {
       Bitmap bm = new Bitmap(1, 1); //画一个点,调整这个点的大小
       Graphics g = Graphics.FromHwnd(this.Handle);//这个点画在哪里
       int X,Y;
       for(X = 0; X<200;X++)
          for (Y = 0; Y < 200; Y++)
            {
              Color pixelColor = bmp.GetPixel(X, Y); //[X][Y]点坐标的颜色
              bm.SetPixel(0, 0, pixelColor);//"画点", 这个点的颜色
              g.DrawImageUnscaled(bm, X, Y);//开始在[X][Y]点画了
            }
    }

            所以我不禁要问了, 这个人脸变换的程序究竟是用什么好的方法实现的? 视频中的效果是十分的流畅啊. 请指教.

  • 相关阅读:
    .NET Core前后端分离快速开发框架(Core.3.0+AntdVue)
    关于框架
    什么是 https ?这应该是全网把 https 讲的最好的一篇文章了
    NET手撸绘制TypeScript类图——下篇
    及时发现问题,力争找到更好的解决办法,而不是得过且过
    一个命令永久禁用Win10驱动程序强制签名
    表达式的结果为true或false
    Parcel 搭建浏览器自动刷新的 非 SPA项目
    Gulp 搭建前端非SPA 项目, 修改文件浏览器自动刷新
    vue 里 this.$parent 作用
  • 原文地址:https://www.cnblogs.com/technology/p/1706698.html
Copyright © 2011-2022 走看看