Mar 3rd 2016
这个工作来源于光设里的视频传输,作为一个可能用到的模块,打算先把他完成。
思路如下:
在树莓派上利用opencv采集视频的每一帧,然后通过脚本利用sz传给客户端,最后在客户端上对接收到的帧进行视频的读取。
在视频采集中遇到一个问题,由于opencv的imwrite函数会在开始写入的时候就创建文件而没有相应的临时文件,所以可能导致脚本读取到的文件并没有完成采集。于是博主在所有文件同级处创建了一个标志位文件,名字为一个数字,每当完成一张图片采集之后,就更新标志位,告诉脚本可读取。
树莓派下的opencv代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #define TIME 1 using namespace cv; int main(){ VideoCapture capture(0); Mat frame; char path[100]="/home/monk/Workspace/opencv/getPicFromCamera/data/"; int recentFile=0; char flagFile[100]; char lastFlagFile[100]; char fileName[100]; sprintf(flagFile,"%s%d",path,recentFile); int fd=open(flagFile,O_WRONLY|O_CREAT); close(fd); while(1){ capture>>frame; sprintf(lastFlagFile,"%s%d",path,recentFile); recentFile++; sprintf(flagFile,"%s%d",path,recentFile); sprintf(fileName,"%sfile%06d.jpg",path,recentFile); imwrite(fileName,frame); rename(lastFlagFile,flagFile); // imshow("Loading Video",frame); if(waitKey(TIME)==27){ break; } } return 0; } |
shell脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/bash ## send data from camera to Client ## @author tim ## @version 1.0 ## @date : March 2nd 2016 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:usr/local/sbin:~/bin export PATH workpath="~/Workspace/opencv/getPicFromCamera/data/" cd $workpath flag=`ls | grep "file" -v` declare -i recentFile recentFile=0 while [ "$flag" == "" ] do flag=`ls | grep "file" -v` done echo "have flag" declare -i flag while [ 1 == 1 ] do flag=`ls | grep "file" -v` if [ "$recentFile" -lt "$flag" ]; then recentFile=$(($recentFile+1)) fileName=`printf "file%06d.jpg" $recentFile ` mv $fileName ../data2/ ## sz $fileName ## rm $fileName -rf fi done |
这里遇到了问题,sz命令在连续使用的时候会出现堵塞的情况。后续考虑使ftp或者其他命令解决
代码可在github中下载,链接暂时放不了,github又崩了
Mar 4th 2016
附上opencv在ubuntu下的配置攻略这是链接
代码在这:github,这一部分工作是统一上传的,所以和别的工程放在同一个repository里了,见谅
Aug 16th 2018
尽然会有两年后的更新hh
OpenCV在linux上的安装已经化简了很多,直接安装一个libopencv-dev就行了,感觉特别方便,在mac下也是直接通过brew安装opencv就行。
其实完全可以不使用脚本直接用C++写视频传输的,但是当时不熟悉C++的socket,然后又是刚刚看了点bash的东西,想稍微练一练。