对摄像头视频进行浮雕处理

Posted by echo069 on August 23, 2018

1.对文件视频进行浮雕处理:先将视频切割成为图片放在指定位置,利用python对图片进行浮雕处理,然后再整合这些处理过的图片。

2.对摄像头视频进行浮雕处理:因为摄像头是实时传输的,而我只会处理文件视频。所以这里采用一个方法:摄像头每工作固定时间就自动进入睡眠,此时它分割的图片进行和文件视频一样的操作,然后摄像头睡眠一定时间再次自启,重复上述操作。

因为在使用gstreamer源文件处理视频上还不成熟,只能使用gst命令行,所以我们要用到shell脚本调用命令行。这里我们需要两个shell脚本,分别是用来放置分割和合成命令行的,即split.sh和combine.sh。还有一个进行浮雕处理的python脚本,即convert.py。还有一个用来调用这三个文件的指挥文件,即handle.c。

切割摄像头内容为图片的split.sh脚本

#!/bin/bash

echo "正在创建目录$0\n\n"
mkdir /home/echo/TEST/test2/pictures/$1 && gst-launch-1.0 v4l2src device=/dev/video0 ! queue ! videorate ! video/x-raw,framerate=25/1 ! jpegenc ! multifilesink location="/home/echo/TEST/test2/pictures/$1/frame%06d.jpg" &


seconds_left=10  
echo "正在切分视频,请等待${seconds_left}秒……\n\n"  
while [ $seconds_left -gt 0 ];do  
    # echo -n $seconds_left  
    sleep 1  
    seconds_left=$(($seconds_left - 1))  
    # echo -ne "\r     \r" #清除本行文字  

done 

echo "正在寻找进程...\n\n"
#kill gst pid
pidlist=`ps -ef|grep device=/dev/video0 |grep -v "grep"|awk '{print $2}'`
echo "成功找到进程\n\n"
function stop(){
if [ "$pidlist" == "" ]
  then
    echo "----gst 已经关闭----"
    exit 0
 else
    echo "gst 进程号 :$pidlist"
    kill -9 $pidlist
    echo "KILL $pidlist:"
fi
}

echo "正在停止进程。。。\n\n"
stop

pidlist2=`ps -ef|grep device=/dev/video0 |grep -v "grep"|awk '{print $2}'`
if [ "$pidlist2" == "" ]
    then 
       echo "----关闭gst成功----\n"
else
    echo "----关闭gst失败----\n"
fi

这里每切割几秒就进入睡眠,睡眠方式通过主动查找进程号直接kill掉.

对图片进行浮雕处理的convert.py

from PIL import Image, ImageFilter
import shutil, os

im_path = "/home/echo/TEST/test2/pictures/"
save_path = "/home/echo/TEST/test2/pictures_conv/"


folders = os.listdir(im_path)
for folder in folders:
    print "folder:" + folder
    files = os.listdir(im_path + folder + "/")
    temp_path = save_path + folder 
    os.mkdir(temp_path)

    for file in files:
        im = Image.open(im_path + folder + "/" + file)
        try:
            im.filter(ImageFilter.EMBOSS).save(temp_path + "/" + file)
        except IOError:
            print("Cannot convert", file)

# im = Image.open(im_path + "0/frame000000.jpg")
# im.filter(ImageFilter.EMBOSS).save(save_path + "0/0.jpg")

合成视频的combine.sh

#!/bin/bash
echo "正在组合视频..."
gst-launch-1.0 multifilesrc location="/home/echo/TEST/test2/pictures_conv/$1/frame%06d.jpg" caps="image/jpeg,framerate=25/1" ! jpegdec ! theoraenc ! oggmux ! filesink location="/home/echo/TEST/test2/videos/out$1.ogg"
echo "组合视频成功"

echo "正在转化视频格式"
ffmpeg -i /home/echo/TEST/test2/videos/out$1.ogg /home/echo/TEST/test2/videos_conv/out$1.ts
echo "转化成功"

因为只找到将图片合成为ogg格式的命令,如果强行转化会出现乱码,所以先合成为ogg格式,再转为ts格式。便于后续操作。

调用以上三个文件的handle.c

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<time.h>
#include<string.h>
int main()
{
    printf("开始处理...\n\n");
    //循环
    for(int i=0; i<3; i++)
    {
        // 从摄像头拿到十秒的视频并分割,将一帧一帧的图片保存在文件夹(i)里
        char split[50];
        sprintf(split, "./split.sh %d", i);
        system(split);


        // 调用python脚本处理这些图片
        char py[50];
        sprintf(py, "python convert.py %d", i);
        system(py);

        // 合并视频, 将长度为十秒的视频放在文件夹里
        char combine[50];
        sprintf(combine, "./combine.sh %d", i);
        system(combine);

        printf("%d\n", i);
 

    }
    return 0;

}

最后执行以下命令即可:

gcc -I/usr/include/python2.7/ handle.c -o a.out `pkg-config --cflags --libs gstreamer-1.0` -L/usr/lib/ -lpython2.7

./a.out