Created on 2013-8-7
URL : http://blog.sina.com.cn/s/blog_a502f1a30101mfj4.html
@author: zhxfl

转载请说明出处

一 从视频中提取帧并且保存图片

#include <iostream>
#include <stdio.h>
#include "opencv2/highgui/highgui.hpp"
using namespace std;
using namespace cv; bool VedioToImage(char *from, char *to)
{
CvCapture *capture = cvCreateFileCapture(from);
if(!capture)
return false;
IplImage *frame = ;
for(int i = , j = ;; j++)
{
frame = cvQueryFrame( capture );
if(frame)
{
if(j % == )
{
char str[];
sprintf(str,"%s/%d.png",to,i);
cvSaveImage(str,frame);
printf("%d.png\n",i++);
}
}
else
{
break;
}
} return true;
} int main()
{
VedioToImage("../fly.mp4","../fly");
return ;
}

从视频中提取帧并且保存成图片

GINC=$(shell pkg-config --cflags opencv)
GLIB=$(shell pkg-config --libs opencv)
all:build
build:a.out
a.o:a.cpp
g++ $(GINC) -c a.cpp
a:a.o
g++ -o a a.o $(GLIB)
clean:
rm *.o
run:build
./a.out

Makefile

二 对一系列图片进行处理,去掉没有检测到人脸的照片

#include <iostream>
#include <iomanip>
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/gpu/gpu.hpp"
#include <stdio.h>
#include <time.h>
using namespace std;
using namespace cv;
using namespace cv::gpu; std::string getWorkspace()
{
#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
std::string workspace = std::string("E:/Resources");
#else
std::string workspace = std::string("/data/ubuntu/Resources");
#endif
return workspace;
} string path = getWorkspace() + "/haarcascade_frontalface_alt.xml";
CascadeClassifier cascade_cpu;//使用cpu的分类器器
CascadeClassifier cascade_gpu;//使用cpu的分类器器
int detectFaceCpu(std::string file)
{
string input = getWorkspace() + string("/image/") + file;
Mat frame_cpu = cv::imread(input.c_str()); Mat gray_cpu;
//转化成灰度图
if (frame_cpu.channels() == )
{
cvtColor(frame_cpu, gray_cpu, CV_BGR2GRAY );
}
else
{
gray_cpu = frame_cpu;
}
vector<Rect> facesBuf_cpu; cascade_cpu.detectMultiScale(gray_cpu, facesBuf_cpu); for(size_t i = ; i < facesBuf_cpu.size();i++)
{
rectangle(frame_cpu, facesBuf_cpu[i], Scalar());
} if(facesBuf_cpu.size())
{
string path = getWorkspace() + string("/image_output/") + file;
IplImage tmp (frame_cpu);
cvSaveImage(path.c_str(), &tmp);
}
return true;
} int detectFaceGpu(std::string file)
{
string input = getWorkspace() + string("/image/") + file;
Mat frame_gpu = cv::imread(input.c_str());
Mat gray_gpu;
//转化成灰度图
if (frame_gpu.channels() == )
{
cvtColor(frame_gpu, gray_gpu, CV_BGR2GRAY );
}
else
{
gray_gpu = frame_gpu;
}
vector<Rect> facesBuf_gpu; cascade_gpu.detectMultiScale(gray_gpu, facesBuf_gpu); for(size_t i = ; i < facesBuf_gpu.size();i++)
{
rectangle(frame_gpu, facesBuf_gpu[i], Scalar());
} if(facesBuf_gpu.size())
{
string path = getWorkspace() + string("/image_output/") + file;
IplImage tmp (frame_gpu);
cvSaveImage(path.c_str(), &tmp);
}
return true;
} int main(int argc, unsigned char* argv[])
{
if (!cascade_cpu.load(path))
{
printf("error cpu\n");
return ;
} if (!cascade_gpu.load(path))
{
printf("errror gpu\n");
return ;
} for(int i = ; i < ;i++)
{
char str[];
sprintf(str, "%03d.tif", i);
float start = clock();
detectFaceGpu(string(str));
float end = clock();
printf("%03d.tif time = %f\n",i ,(end - start) / );
}
return ;
}

三 使用摄像头录制视频

#include <iostream>
#include <iomanip>
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/gpu/gpu.hpp"
#include <stdio.h>
#include <time.h>
using namespace std;
using namespace cv;
using namespace cv::gpu; std::string getWorkspace()
{
#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
std::string workspace = std::string("E:/Resources");
#else
std::string workspace = std::string("/data/ubuntu/Resources");
#endif
return workspace;
} int main(int argc, unsigned char* argv[])
{
for(int k = ; k < ; k++)
{
char str[];
sprintf(str, "/%d.avi",k);
string path = getWorkspace() + string(str);
CvVideoWriter * writer = cvCreateVideoWriter(path.c_str(),CV_FOURCC('X','V','I','D'),,cvSize(,)); // 需要安装xvid编码器 CvCapture* capture1 = cvCaptureFromCAM();
int w = , h = ;
cvSetCaptureProperty ( capture1, CV_CAP_PROP_FRAME_WIDTH, w );
cvSetCaptureProperty ( capture1, CV_CAP_PROP_FRAME_HEIGHT, h );
cvNamedWindow( "Camera_1", CV_WINDOW_AUTOSIZE );
IplImage* frame1;
int n = ;
int i =;
while()
{
frame1 = cvQueryFrame( capture1 );
if( !frame1 ) break;
{
cvShowImage( "Camera_1", frame1 );
cvWriteFrame(writer,frame1); //写入文件
}
int key = cvWaitKey();
if( key == ) break;
if(i >= )break;
else i++;
printf("%d\n",i);
}
cvReleaseVideoWriter(&writer);
cvReleaseCapture( &capture1 );
cvDestroyWindow( "Camera_1" );
}
return ;
}

四 将视频流分成两部分,一部分是能够圈到人脸,一部分不能。

#include <iostream>
#include <iomanip>
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/gpu/gpu.hpp"
#include <stdio.h>
#include <time.h>
using namespace std;
using namespace cv;
using namespace cv::gpu; std::string getWorkspace()
{
#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
std::string workspace = std::string("E:/Resources");
#else
std::string workspace = std::string("/data/hadoop/Resources");
#endif
return workspace;
} CascadeClassifier cascade_cpu;//使用cpu的分类器器
CascadeClassifier_GPU cascade_gpu;//使用cpu的分类器器 bool detectFaceCpu(Mat &frame_cpu)
{
Mat gray_cpu;
//转化成灰度图
if (frame_cpu.channels() == )
{
cvtColor(frame_cpu, gray_cpu, CV_BGR2GRAY );
}
else
{
gray_cpu = frame_cpu;
}
vector<Rect> facesBuf_cpu; cascade_cpu.detectMultiScale(gray_cpu, facesBuf_cpu, 1.2, ); for(size_t i = ; i < facesBuf_cpu.size();i++)
{
rectangle(frame_cpu, facesBuf_cpu[i], Scalar());
}
if(facesBuf_cpu.size())
{
return true;
}
else
{
return false;
}
} int detectFaceGpu(Mat &frame)
{
GpuMat frame_gpu(frame);
GpuMat gray_gpu;
//转化成灰度图
if (frame_gpu.channels() == )
{
cvtColor(frame_gpu, gray_gpu, CV_BGR2GRAY );
}
else
{
gray_gpu = frame_gpu;
}
GpuMat facesBuf_gpu;
Mat faces_downloaded; cascade_gpu.findLargestObject = true;
int detections_num =
cascade_gpu.detectMultiScale(gray_gpu, facesBuf_gpu, 1.2, ); facesBuf_gpu.colRange(, detections_num).download(faces_downloaded); for (int i = ; i < detections_num; ++i)
{
rectangle(frame, faces_downloaded.ptr<cv::Rect>()[i], Scalar());
} if(detections_num)
{
return true;
}
else
{
return false;
}
} void decompound_cpu(string in,string out_1, string out_2)
{
//摄像头对象
CvCapture *capture = cvCreateFileCapture(in.c_str());
int w = , h = ;
cvSetCaptureProperty ( capture, CV_CAP_PROP_FRAME_WIDTH, w );
cvSetCaptureProperty ( capture, CV_CAP_PROP_FRAME_HEIGHT, h ); CvVideoWriter * writer1 =
cvCreateVideoWriter(out_1.c_str(),CV_FOURCC('X','V','I','D'),,cvSize(w,h));
CvVideoWriter * writer2 =
cvCreateVideoWriter(out_2.c_str(),CV_FOURCC('X','V','I','D'),,cvSize(w,h));
IplImage* frame;
cvNamedWindow("Camera_1", CV_WINDOW_AUTOSIZE );
cvNamedWindow("Camera_2", CV_WINDOW_AUTOSIZE );
static int i = ;
while()
{
frame = cvQueryFrame(capture);
Mat mat(frame);
if(mat.empty())
{
printf("finish !!!\n");
break;
} if(detectFaceGpu(mat))
{
cvShowImage("Camera_1", frame);
printf("y = %d\n", i++);
cvWriteFrame(writer1, frame); //写入文件
}
else
{
printf("n = %d\n", i++);
cvShowImage( "Camera_2", frame);
cvWriteFrame(writer2, frame); //写入文件
} int key = cvWaitKey();
if( key == ) break;
}
cvReleaseVideoWriter(&writer1);
cvReleaseVideoWriter(&writer2);
cvReleaseCapture(&capture);
cvDestroyWindow("Camera_1");
cvDestroyWindow("Camera_2");
} bool init()
{
string path = getWorkspace() + "/haarcascade_frontalface_alt.xml";
if (!cascade_cpu.load(path))
{
printf("error cascade_cpu load\n");
return ;
} if (!cascade_gpu.load(path))
{
printf("errror cascade_gpu load\n");
return ;
}
return true;
} int main(int argc, char* argv[])
{
init();
string x1 = getWorkspace() + string("/4.avi");
string x2 = getWorkspace() + string("/image_output/4_1.avi");
string x3 = getWorkspace() + string("/image_output/4_2.avi");
decompound_cpu(x1,x2,x3);
return ;
}

五从视频流中提取出某个人的视频来

#include <iostream>
#include <iomanip>
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/gpu/gpu.hpp"
#include <stdio.h>
#include <time.h>
#include "personName.h"
#include "util.h" using namespace std;
using namespace cv;
using namespace cv::gpu; CascadeClassifier cascade_cpu;//使用cpu的分类器器
CascadeClassifier_GPU cascade_gpu;//使用cpu的分类器器
int predict_id = -;
float s_confidence = ;
IplImage * getFace(IplImage *img, CvRect rect)
{
static int id = ;
cvSetImageROI(img,rect);
IplImage *tmp;
tmp=cvCreateImage(cvSize(,),IPL_DEPTH_8U,);
cvResize(img,tmp,CV_INTER_LINEAR);
cvResetImageROI(img);
return tmp;
} int predict(Mat &mat)
{
static bool init = true;
static Ptr<FaceRecognizer> model;
if(init)
{
model = createEigenFaceRecognizer();
string str = getWorkspace() + string("/face.xml");
model->load(str.c_str());
init = false;
} int predictedLabel = -;
double confidence = 0.0; model->predict(mat, predictedLabel, confidence); string result_message = format("%10s confidence = %lf", PersonName::build()->getName(predictedLabel).c_str(), confidence);
printf("%s\n",result_message.c_str());
if(confidence < s_confidence) return predictedLabel;
else return -;
} bool detectFaceCpu(Mat &frame_cpu)
{
Mat gray_cpu;
//转化成灰度图
if (frame_cpu.channels() == )
{
cvtColor(frame_cpu, gray_cpu, CV_BGR2GRAY );
}
else
{
gray_cpu = frame_cpu;
}
vector<Rect> facesBuf_cpu; cascade_cpu.detectMultiScale(gray_cpu, facesBuf_cpu, 1.2, ); IplImage img(gray_cpu);
for(size_t i = ; i < facesBuf_cpu.size();i++)
{
rectangle(frame_cpu, facesBuf_cpu[i], Scalar());
Mat tmp(getFace(&img, facesBuf_cpu[i]));
int id = predict(tmp);
if(id != predict_id)continue;
return true;
}
return false;
} int detectFaceGpu(Mat &frame)
{
GpuMat frame_gpu(frame);
GpuMat gray_gpu;
Mat gray_cpu;
//转化成灰度图
if (frame_gpu.channels() == )
{
cvtColor(frame_gpu, gray_gpu, CV_BGR2GRAY);
cvtColor(frame, gray_cpu, CV_BGR2GRAY);
}
else
{
gray_gpu = frame_gpu;
gray_cpu = frame;
}
GpuMat facesBuf_gpu;
Mat faces_downloaded; cascade_gpu.findLargestObject = true;
int detections_num =
cascade_gpu.detectMultiScale(gray_gpu, facesBuf_gpu, 1.2, ); facesBuf_gpu.colRange(, detections_num).download(faces_downloaded); IplImage img(gray_cpu);
for (int i = ; i < detections_num; ++i)
{
rectangle(frame, faces_downloaded.ptr<cv::Rect>()[i], Scalar());
Mat tmp(getFace(&img, faces_downloaded.ptr<cv::Rect>()[i]));
int id = predict(tmp);
if(id != predict_id)continue;
return true;
}
return false;
} void decompound_cpu(string in,string out_1, string out_2)
{
//摄像头对象
CvCapture *capture = cvCreateFileCapture(in.c_str());
int w = , h = ;
cvSetCaptureProperty ( capture, CV_CAP_PROP_FRAME_WIDTH, w );
cvSetCaptureProperty ( capture, CV_CAP_PROP_FRAME_HEIGHT, h ); CvVideoWriter * writer1 =
cvCreateVideoWriter(out_1.c_str(),CV_FOURCC('X','V','I','D'),,cvSize(w,h));
CvVideoWriter * writer2 =
cvCreateVideoWriter(out_2.c_str(),CV_FOURCC('X','V','I','D'),,cvSize(w,h));
IplImage* frame;
cvNamedWindow("Camera_1", CV_WINDOW_AUTOSIZE );
cvNamedWindow("Camera_2", CV_WINDOW_AUTOSIZE );
static int i = ;
while()
{
frame = cvQueryFrame(capture);
Mat mat(frame);
if(mat.empty())
{
printf("finish !!!\n");
break;
} if(detectFaceGpu(mat))
{
cvShowImage("Camera_1", frame);
printf("y = %d\n", i++);
cvWriteFrame(writer1, frame); //写入文件
}
else
{
printf("n = %d\n", i++);
cvShowImage( "Camera_2", frame);
cvWriteFrame(writer2, frame); //写入文件
} int key = cvWaitKey();
if( key == ) break;
}
cvReleaseVideoWriter(&writer1);
cvReleaseVideoWriter(&writer2);
cvReleaseCapture(&capture);
cvDestroyWindow("Camera_1");
cvDestroyWindow("Camera_2");
} bool init()
{
predict_id = ;
s_confidence = ;
string path = getWorkspace() + "/haarcascade_frontalface_alt.xml";
if (!cascade_cpu.load(path))
{
printf("error cascade_cpu load\n");
return ;
} if (!cascade_gpu.load(path))
{
printf("errror cascade_gpu load\n");
return ;
}
return true;
} int main(int argc, char* argv[])
{
init();
string x1 = getWorkspace() + string("/17.avi");
string x2 = getWorkspace() + string("/image_output/17_1.avi");
string x3 = getWorkspace() + string("/image_output/17_2.avi");
decompound_cpu(x1,x2,x3);
return ;
}

opencv 重用代码块记录的更多相关文章

  1. python功能代码块记录

    python Autopep8——按PEP8风格自动排版Python代码(参考链接) autopep8 --in-place --aggressive --aggressive test_autope ...

  2. 记录我的 python 学习历程-Day06 is id == / 代码块 / 集合 / 深浅拷贝

    一.is == id 用法 在Python中,id是内存地址, 你只要创建一个数据(对象)那么就会在内存中开辟一个空间,将这个数据临时加载到内存中,这个空间有一个唯一标识,就好比是身份证号,标识这个空 ...

  3. python代码块,小数据池,驻留机制深入剖析

    一,什么是代码块. 根据官网提示我们可以获知: 根据提示我们从官方文档找到了这样的说法: A Python program is constructed from code blocks. A blo ...

  4. Python小数据池,代码块

    今日内容一些小的干货 一. id is == 二. 代码块 三. 小数据池 四. 总结 python小数据池,代码块的最详细.深入剖析   一. id is == 二. 代码块 三. 小数据池 四. ...

  5. python小数据池,代码块知识

    一.什么是代码块? 根据官网提示我们可以获知: A Python program is constructed from code blocks. A block is a piece of Pyth ...

  6. Python基础学习Day6 is id == 区别,代码块,小数据池 ---->>编码

    一.代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...

  7. python小数据池,代码块的最详细、深入剖析

    代码块: Python程序是由代码块构造的.块是 一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...

  8. 五.python小数据池,代码块的最详细、深入剖析

    一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是 ...

  9. python 小数据池,代码块, is == 深入剖析

    python小数据池,代码块的最详细.深入剖析   一. id is == 二. 代码块 三. 小数据池 四. 总结 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了, ...

随机推荐

  1. ubuntu下编译安装apache

    官网http://httpd.apache.org/download.cgi下载apache源码包后 /*解包*/ gzip -d httpd-2_x_NN.tar.gz tar -xf httpd- ...

  2. centOS 6 python MySQLdb 提示 no module

    http://www.cnblogs.com/czh-liyu/archive/2012/11/30/2796028.html(转) 用python连接本地数据库时,提示no module MySQL ...

  3. H5小内容(一)

    HTML5目前最新的规范(标准)是2014年10月推出   2005年左右出现HTML5版本(非标准)     W3C组织(两个组织定义H5规范)   学习(研究)HTML5是学习未来(将来主流)   ...

  4. yii2源码学习笔记(二十)

    Widget类是所有部件的基类.yii2\base\Widget.php <?php /** * @link http://www.yiiframework.com/ * @copyright ...

  5. PHP5.5安装php-redis扩展

    windows下开发用的xampp集成的环境,想装个php-redis扩展,扩展的github地址: https://github.com/nicolasff/phpredis 描述里找到window ...

  6. mysql添加超级管理员

    mysql>create user 'myroot'@'localhost' identified by 'myroot'; mysql>grant all privileges on * ...

  7. 深入探究JavaScript中的比较问题

    先用最近遇到的几个问题做引子: 1 console.log(null==undefined); //true 2 console.log(null==false);//false 3 console. ...

  8. 如何创建一个自定义jQuery插件

    简介 jQuery 库是专为加快 JavaScript 开发速度而设计的.通过简化编写 JavaScript 的方式,减少代码量.使用 jQuery 库时,您可能会发现您经常为一些常用函数重写相同的代 ...

  9. 把 Eclipse 中的工程 Push 到 Github(适用 Windows 平台)

    今天发现一小技巧,关于如何把Eclipse的某一个Existing project push 到github服务器. Eclipse 应该是 JavaEE 版本. 在project 右键 team, ...

  10. SQLMAP系列教程

    1.SQLMAP安装及access注入: http://www.stronkin.com/en/CompHonorBig.asp?id=7   2.Mysql数据库注入 http://www.slib ...