(三)为视频增加滤镜效果

新建一个滤镜操作的类ImageFilter,已经实现了原图,灰度图,二值化,马赛克效果。

import java.awt.*;
import java.awt.image.BufferedImage;

public class ImageFilter {

    public BufferedImage drawImage(Graphics g, BufferedImage image) {
        g.drawImage(image, 0, 0, null);
        return image;
    }

    public BufferedImage grayImageFilter(Graphics g, BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                int rgb = image.getRGB(i, j);
                int red = (rgb >> 16) & 0xff;
                int green = (rgb >> 8) & 0xff;
                int blue = rgb & 0xff;
                int gray = (int) (0.3 * red + 0.35 * green + 0.35 * blue);
                rgb = (rgb & 0xff000000) | (gray << 16) | (gray << 8) | gray;
                image.setRGB(i, j, rgb);
            }
        }
        g.drawImage(image, 0, 0, null);
        return image;
    }

    public BufferedImage binaryImageFilter(Graphics g, BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                int rgb = image.getRGB(i, j);
                int red = (rgb >> 16) & 0xff;
                int green = (rgb >> 8) & 0xff;
                int blue = rgb & 0xff;
                int gray = (int) (0.3 * red + 0.35 * green + 0.35 * blue);
                if (gray > 70) {
                    gray = 255;
                } else {
                    gray = 0;
                }
                rgb = (rgb & 0xff000000) | (gray << 16) | (gray << 8) | gray;
                image.setRGB(i, j, rgb);
            }
        }
        g.drawImage(image, 0, 0, null);
        return image;
    }

        public BufferedImage mosaicImageFilter(Graphics g, BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();
        BufferedImage image0 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < width; i+=10) {
            for (int j = 0; j < height; j+=10) {
                int rgb = image.getRGB(i, j);
                for (int k = 0; k < 10; k++) {
                    for (int l = 0; l < 10; l++) {
                        image0.setRGB(i+k, j+l, rgb);
                    }
                }
            }
        }
        g.drawImage(image0, 0, 0, null);
        return image0;
    }

}

在线程RunVideoAble中的run()函数中加入判断选择滤镜效果。

import com.github.sarxos.webcam.Webcam;

import java.awt.*;
import java.awt.image.BufferedImage;

public class RunVideoAble implements Runnable{
    Webcam webcam = Webcam.getDefault();
    boolean flag = false;
    Graphics g = null;
    BufferedImage image = null;
    ImageFilter imageFilter = new ImageFilter();
    String videoOp = "原图";
    public RunVideoAble(Webcam webcam, Graphics g) {
        this.webcam = webcam;
        this.g = g;
    }
    public BufferedImage getImage() {
        return image;
    }
    public void open() {
        flag = true;
        webcam.open();
    }
    public void close() {
        flag = false;
        webcam.close();
    }
    public void setVideoOp(String videoOp) {
        this.videoOp = videoOp;
    }

    @Override
    public void run() {
        while (flag) {
            image = webcam.getImage();
            if (videoOp.equals("原图")) {
                g.drawImage(image, 0, 0, null);
            } else if (videoOp.equals("灰度图")) {
                image = imageFilter.grayImageFilter(g, image);
            } else if (videoOp.equals("二值化")) {
                image = imageFilter.binaryImageFilter(g, image);
            } else if (videoOp.equals("马赛克")) {
                image = imageFilter.mosaicImageFilter(g, image);
            }

        }
    }
}

滤镜的效果依旧通过监听器(VCListener)来选择。修改RunVideoAble中的videoOp控制滤镜。

import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamResolution;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;

public class VCListener implements ActionListener {

    Graphics g = null;
    boolean flag = false;
    RunVideoAble rvt;
    Webcam webcam = Webcam.getDefault();
    public void setG(Graphics g) {
        this.g = g;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        String ac = e.getActionCommand();
        JButton btn = (JButton)e.getSource();
        String str = btn.getText();
//        webcam.setViewSize(WebcamResolution.VGA.getSize());
        if (ac.equals("camOp")) {
            if (str.equals("启动")) {
                rvt = new RunVideoAble(webcam, g);
                rvt.open();
                Thread t = new Thread(rvt);
                t.start();
            } else if (str.equals("关闭")) {
                rvt.close();
                webcam.close();
            } else if (str.equals("拍照")) {
                BufferedImage image = rvt.getImage();
//            g.drawImage(image, 500, 500, null);
                JFileChooser chooser = new JFileChooser();
                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                        "JPG &amp; GIF Images", "jpg", "gif");
                chooser.setFileFilter(filter);
                int returnVal = chooser.showOpenDialog(null);
                if(returnVal == JFileChooser.APPROVE_OPTION) {
                    System.out.println("You chose to open this file: " +
                            chooser.getSelectedFile().getName());
                    try {
                        ImageIO.write(image, "png", chooser.getSelectedFile());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        } else if (ac.equals("videoOp")) {
            rvt.setVideoOp(str);
        }


    }
}

按钮处 setActionCommand() 用于监听器中判断是 camOp 还是 videoOp 。

import javax.swing.*;
import java.awt.*;

public class VideoCapture extends JFrame {
    String[] camstrs = {"启动", "关闭", "拍照"};
    String[] filterstrs = {"原图", "灰度图", "二值化", "马赛克"};
    VCListener vcl = new VCListener();

    public void initUI() {
        setTitle("VideoCapture");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 500);
        setLocation(360, 210);
        JPanel vpanel = new JPanel();
        JPanel bpanel = new JPanel();
        vpanel.setBackground(Color.BLACK);
        bpanel.setBackground(Color.LIGHT_GRAY);
        add(vpanel, BorderLayout.CENTER);
        add(bpanel, BorderLayout.SOUTH);
        for (String str: camstrs) {
            JButton btn = new JButton(str);
            btn.setPreferredSize(new Dimension(80, 50));
            btn.setActionCommand("camOp");
            btn.addActionListener(vcl);
            bpanel.add(btn);
        }
        for (String str: filterstrs) {
            JButton btn = new JButton(str);
            btn.setPreferredSize(new Dimension(80, 50));
            btn.setActionCommand("videoOp");
            btn.addActionListener(vcl);
            bpanel.add(btn);
        }


        setVisible(true);
        vcl.setG(vpanel.getGraphics());
    }

    public static void main(String[] args) {
        new VideoCapture().initUI();
    }
}

通过运行程序,并将加上滤镜后的效果成功保存到计算机中。

         

                                1. 原图                                                                  2. 灰度图

        

                                3. 二值化                                                               4. 马赛克

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用PyAV进行视频剪辑、锐化、添加滤镜增加比特率的示例代码: ```python import av import numpy as np from PIL import Image, ImageDraw, ImageFont # 定义剪辑视频函数 def clip_video(input_file, output_file, start_time, end_time): container = av.open(input_file) stream = container.streams.video[0] codec = stream.codec_context fps = stream.average_rate width = codec.width height = codec.height # 计算剪辑后的时间和帧数 start_pts = int(start_time * fps) end_pts = int(end_time * fps) duration = end_pts - start_pts # 创建输出流 output_container = av.open(output_file, 'w') output_stream = output_container.add_stream('h264', rate=fps) output_stream.width = width output_stream.height = height output_stream.pix_fmt = 'yuv420p' # 剪辑视频 for packet in container.demux(stream): if packet.pts < start_pts: continue if packet.pts >= end_pts: break for frame in packet.decode(): output_stream.encode(output_stream.time_base * (frame.pts - start_pts), frame) output_container.close() # 定义锐化和添加滤镜函数 def sharpen_and_filter(input_file, output_file): container = av.open(input_file) stream = container.streams.video[0] codec = stream.codec_context fps = stream.average_rate width = codec.width height = codec.height # 创建输出流 output_container = av.open(output_file, 'w') output_stream = output_container.add_stream('h264', rate=fps) output_stream.width = width output_stream.height = height output_stream.pix_fmt = 'yuv420p' # 处理视频 for packet in container.demux(stream): for frame in packet.decode(): # 锐化 sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) sharpened_frame = cv2.filter2D(frame.to_rgb().to_ndarray(), -1, sharpen_kernel) # 添加滤镜 img = Image.fromarray(sharpened_frame) draw = ImageDraw.Draw(img) font = ImageFont.truetype('arial.ttf', 60) draw.text((100, 100), 'Hello World!', (255, 0, 0), font=font) filtered_frame = np.asarray(img) # 编码并写入输出流 output_stream.encode(output_stream.time_base * frame.pts, av.VideoFrame.from_ndarray(filtered_frame, format='rgb24')) output_container.close() # 定义增加比特率函数 def increase_bitrate(input_file, output_file, bitrate): container = av.open(input_file) stream = container.streams.video[0] # 创建输出流 output_container = av.open(output_file, 'w') output_stream = output_container.add_stream('h264', rate=stream.average_rate) output_stream.width = stream.codec_context.width output_stream.height = stream.codec_context.height output_stream.pix_fmt = 'yuv420p' output_stream.bit_rate = bitrate # 处理视频 for packet in container.demux(stream): for frame in packet.decode(): output_stream.encode(output_stream.time_base * frame.pts, frame) output_container.close() # 调用剪辑视频函数 clip_video('input.mp4', 'output1.mp4', 10, 20) # 调用锐化和添加滤镜函数 sharpen_and_filter('output1.mp4', 'output2.mp4') # 调用增加比特率函数 increase_bitrate('output2.mp4', 'output3.mp4', 2000000) ``` 你只需要修改函数中的输入文件路径、输出文件路径、剪辑时间、滤镜效果和比特率等参数,然后调用相应的函数即可进行视频剪辑、锐化、添加滤镜增加比特率等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值