OpenCV常用小工具……

图像批量缩放(改名)小工具(OpenCV2.4.4+Qt5.2.1+MSVC2010):

#include <opencv2/opencv.hpp>//我很懒

using namespace std;
using namespace cv;

int main(){
    string src_img_name = "D:yaleface/";
    string dst_img_name = "D:yale/";
    char charn[3],chari[3],charj[3];
    
    //把s1.bmp..s165.bmp改名为i_sj.bmp并缩小图像
    for(int i=1;i<=15;i++){
        for(int j=1;j<=11;j++){
            _itoa((i-1)*11+j,charn,10);
            _itoa(i,chari,10);
            _itoa(j,charj,10);

            //输入文件夹的文件s1.bmp...s165.bmp
            src_img_name+="s";
            src_img_name+=charn;
            src_img_name+=".bmp";

            Mat src_img = imread(src_img_name,0);
            Mat dst_img;
            resize(src_img,dst_img,Size(40,40),0,0,INTER_LINEAR);

            //输出文件夹中的文件名1_s1..1_s11..2_s1..2_s11....15_s11.
            dst_img_name+=chari;
            dst_img_name+="_s";
            dst_img_name+=charj;
            dst_img_name+=".bmp";

            imwrite(dst_img_name,dst_img);
            src_img_name = "D:yaleface/";
            dst_img_name = "D:yale/";
            clog<<(i-1)*11+j<<endl;
        }
    }
}

 

2. 批量图片写成视频(OpenCV2.4.4+Qt5.2.1+MSVC2010):

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(){
    //我的环境下所有目录都不能有中文.
    string dir_name = "F:/baiduyundownload/face/1_1_05(06)_0/prob/dongnanmeneast_15_1920x1080_30_R1/";
    char img_name[6];

    Mat img_src = imread("F:baiduyundownload/face/1_1_05(06)_0/prob/dongnanmeneast_15_1920x1080_30_R1/15980.jpg");
    if(img_src.empty())
        cerr<<"imread image error";

    VideoWriter output_src("D:faceDetect.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);
    //我的图片名是15980.jpg,15982.jpg...18000.jpg
    for(int i=15980;i<18000;i+=2){

        /****图片名字处理****/
        _itoa(i,img_name,10);
        dir_name+=img_name;
        dir_name+=".jpg";

        img_src=imread(dir_name);//显示
        if(img_src.empty())
            return 0;
        output_src<<img_src;//写入
        imshow("src",img_src);

        char c = waitKey(10);
        if(27==c)
            return 0;

        clog<<i<<endl;
        dir_name = "F:/baiduyundownload/face/1_1_05(06)_0/prob/dongnanmeneast_15_1920x1080_30_R1/";
    }
    return 0;
}

 

3. 读取视频序列:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){
    VideoCapture capture("D:faceDetect.avi");
    if(!capture.isOpened()){
        clog<<"Read Video Error";
        return 0;
    }

    double videoFPS = capture.get(CV_CAP_PROP_FPS);
    int videoDelay = 1000/videoFPS;
    bool stop = false;
    Mat frame;

    while(!stop){
        if(!capture.read(frame))
            break;
        imshow("SHOW",frame);
        if(waitKey(videoDelay)>=0)
            stop = true;
    }
}

 stop可以提供外部控制接口,如果不需要的话,也可以简化如下:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){
    VideoCapture capture("D:faceDetect.avi");
    if(!capture.isOpened()){
        clog<<"Read Video Error";
        return 0;
    }

    double videoFPS = capture.get(CV_CAP_PROP_FPS);
    int videoDelay = 1000/videoFPS;
    Mat frame;

    while(capture.read(frame)){
        if(frame.empty())
            break;
        imshow("Video Demo",frame);
        if(waitKey(videoDelay)==27)
            break;
    }
}

 

 4. 剪切视频段:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(){
    //打开原输入视频
    VideoCapture capture("C:tuike.avi");
    if(!capture.isOpened()){
        cout<<"open failed";
        return 0;
    }
    //设置剪切的起始位置
    double position = 31680;
    capture.set(CV_CAP_PROP_POS_FRAMES,position);

    //设置剪切后的视频属性
    Mat frame;
    capture.read(frame);
    VideoWriter output_video("D:suozixie1.avi",CV_FOURCC('M','J','P','G'),45,frame.size(),1);

    //循环剪切视频31681-40000帧
    while(position<=40000){
        if(!capture.read(frame)){
            cout<<"read failed";
            break;
        }
        output_video<<frame;
        position++;
    }
}

 

5. 读写摄像头:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){
    VideoCapture camera(0);//打开默认摄像头
    if(!camera.isOpened()){
        clog<<"Read Video Error";
        return 0;
    }

    Mat frame;
    camera.read(frame);
    //写入的视频路径,编码方式,FPS,大小,彩色.
    VideoWriter video("D:try.avi",CV_FOURCC('M','J','P','G'),15,frame.size(),1);
    while(camera.read(frame)){
        if(frame.empty())
            break;
        imshow("Video Demo",frame);
        video<<frame;
        if(waitKey(33)==27)//ESC结束拍摄
            break;
    }
}

 

6. 从已知文本信息中分割图像:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
using namespace cv;

int main(){
//从已知文本信息中分割图像
    ifstream input("D:ImageInfo.txt");
    string sinput;

    //我的环境下所有目录都不能有中文.
    string dir_name = "D:dongnanmeneast_15_1920x1080_30_R1/";
    string dst_name = "D:secface/";
    char img_name[6];

    input>>sinput;
    Mat img_src;
    for(int i=15980;i<=18080;i+=2){
        /****图片名字处理****/
        _itoa(i,img_name,10);
        dir_name+=img_name;
        dir_name+=".jpg";

        int n=0;
        while(((string)img_name+".jpg")==sinput.c_str()){
            //从txt文档中获取face的位置x,y,w,h.
            string l,t,r,b;
            input>>l>>t>>r>>b;
            int x = atoi(l.c_str());
            int y = atoi(t.c_str());
            int width = atoi(r.c_str())-x;
            int height = atoi(b.c_str())-y;
            
            //保存图像的名称
            char si[2];
            itoa(n,si,10);
            dst_name += img_name;
            dst_name +="_face";
            dst_name +=si;
            dst_name +=".jpg";
            
            //保存感兴趣区域即face图像
            img_src=imread(dir_name);//read
            Mat imgROI = img_src(Rect(x,y,width,height));
            imwrite(dst_name,imgROI);

            sinput = "";
            cout<<n<<endl;
            n++;
            input>>sinput;
            dst_name = "D:secface/";
        }
        dir_name = "D:dongnanmeneast_15_1920x1080_30_R1/";
        cout<<i<<endl;
    }
    cout<<"complete";
    return 0;
}

 

posted @ 2014-05-12 14:52  Beenking  阅读(1665)  评论(0编辑  收藏  举报