如何实现两个人脸照片的变换

        相信想做你的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循环:

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

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

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

 
1
2
3
4
5
6
7
8
9
10
11
12
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]点画了
        }
}

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

posted @   Create Chen  阅读(9256)  评论(19编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示