• 基于opencv将视频转化为字符串Java版


    基于opencv将视频转化为字符串Java版

    先上一个效果图吧

    首先,弄清一下原理

    我们要将视频转化为字符画,那么就需要获取画面的每一帧,也就是每一张图片,然后将图片进行转化,变成字符串,然后进行打印。

    1.获取视频

    在opencv中提供了一个函数去获取视频

    VideoCapture capture = new VideoCapture("");//里面放图片的地址
    //ps:如果里面为0[不要"",就是整数0],则就对默认摄像头进行抓取
    Mat mat = new Mat();
    //读取下一帧
    capture.read(mat);//返回值为boolean类型
    

    设想一下,如果我们使用循环去读取下一帧,那么就可以源源不断的得到视频画面

    2.灰度转换

    先说一下图片的转换原理:我们是根据图片像素点上面颜色的深浅来使用不同复杂程度的字符来替代它.那么这时候我们就可以将图片进行灰度转换,颜色深的地方放复杂的字符就行了.

    Mat img_mat = new Mat();
    //mat表示要要转换的图片[Mat类型],img_mat表示转换后的图片
    Imgproc.cvtColor(mat, img_mat, Imgproc.COLOR_RGB2GRAY);
    //获得图片的灰度值  i,j 表示像素点的位置(姑且理解为像素点吧)
    int gray = (int) img_mat.get(i, j)[0];
    

    3.字符串转换

    我们会根据灰度的大小放不同的字符

    String ascii = "#8XOHLTI)i=+;:,. ";//字符串由复杂到简单
    
    StringBuilder result = new StringBuilder();
    //使用for循环获得图像每一个地方的灰度值
    for (int i = 0; i < img_mat.rows(); i+=14) {
        //i+14 j+14 每隔14取一个点 是防止视频过大,产生的result过长,整个屏幕无法显示完全
        for (int j = 0; j < img_mat.cols(); j+=14) {
            StringBuilder result = new StringBuilder();
            int gray = (int) img_mat.get(i, j)[0];
            //Math.round进行四舍五入
            int index = Math.round(gray * (ascii.length() + 1) / 255);
            result.append(index >= ascii.length() ? "." : String.valueOf(ascii.charAt(index)));
        }
        result = result.append("
    ");
    }
    
    //Ubuntu 进行清屏操作
    System.out.print("33c");
    System.out.println(result);
    
    

    注意:不要使用result+="",因为这个在很长的字符串上连接效率太慢.

    总结

    总的来说,就是根据视频的灰度的大小,用不同复杂度的字符串来替代。
    如果你喜欢这篇文章的话,就给个start✮吧,项目下载地址:GitHub⊙﹏⊙∥∣°

    ≡(▔﹏▔)≡

    opencv 在Ubuntu环境下的搭建我会在下篇讲哦
    <(‵^′)>

  • 相关阅读:
    为什么比特币和以太坊未必真得比EOS更去中心化?
    为什么我说IPFS社区从卖矿机开始,就是错的
    人群捕捞,不知不觉控制你
    Maven解决repository不更换的问题
    Ubuntu安装mysql-proxy
    Ubuntu的NTP同步时钟设置方法
    MySQL索引原理及慢查询优化
    MySQL对比清除不必要的表
    MySQL5.7绿色版安装
    Ubuntu下监控服务
  • 原文地址:https://www.cnblogs.com/xiaohuiduan/p/9867646.html
Copyright © 2020-2023  润新知