OpenCV人脸检测并把图片写成avi视频
生活随笔
收集整理的這篇文章主要介紹了
OpenCV人脸检测并把图片写成avi视频
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
讀出某一個文件夾下“jpg”后綴的全部圖片后,用的OpenCV自帶的人臉檢測檢測圖片中的人臉,調整圖片的大小寫成一個avi視頻。
主要是要記錄一下CvVideoWriter的用法和如何從文件夾中讀取某一后綴的全部文件。
代碼:
#include "stdafx.h"#include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <iostream> #include <string>#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <math.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> #include <io.h> using namespace cv; using namespace std;void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip );int main(int argc, char** argv) { CascadeClassifier cascade, nestedCascade;bool stop = false;//訓練好的文件名稱,放置在可執行文件同目錄下cascade.load("haarcascade_frontalface_alt.xml");nestedCascade.load("haarcascade_eye_tree_eyeglasses.xml");// 圖片集 string fileFolderPath = "F:\\picture"; string fileExtension = "jpg"; string fileFolder = fileFolderPath + "\\*." + fileExtension; int codec = 0; double frameRate = 1; CvSize frameSize; struct _finddata_t fileInfo; // 文件信息結構體// 1. 第一次查找 long findResult = _findfirst(fileFolder.c_str(), &fileInfo); if (findResult == -1) { _findclose(findResult); return -1; } //2.設置視頻的寬度和高度為 讀取到的圖片的最大寬度和最大高度int width = 0 ;int height = 0 ;IplImage* img; string file_path ;do {string temp_name = fileInfo.name;file_path = fileFolderPath + "\\" + temp_name ;img = cvLoadImage(file_path.c_str()); // 讀入圖片 if(img->width > width){width = img->width ;}if(img->height > height){height = img->height ;}} while (!_findnext(findResult, &fileInfo));_findclose(findResult); // 3.生成視頻 frameSize.width = width ;frameSize.height = height ;int zero_H = 0 ;int zero_W = 0 ;CvVideoWriter* writer = cvCreateVideoWriter("output.avi",CV_FOURCC('X','V','I','D'),frameRate,frameSize);cvNamedWindow("Pic2avi",0);cvNamedWindow("img"); struct _finddata_t fileInfo2; // 文件信息結構體long findResult2 = _findfirst(fileFolder.c_str(), &fileInfo2); if (findResult2 == -1) { _findclose(findResult2); return -1; } do { string t_name = fileInfo2.name;string t_file_path = fileFolderPath + "\\" + t_name ;IplImage* frame = cvLoadImage(t_file_path.c_str(), 1); // 讀入圖片cvShowImage("img", frame); IplImage* temp_frame = cvCreateImage(frameSize, IPL_DEPTH_8U, 3) ;if(frame->width <= frameSize.width){zero_W = (frameSize.width - frame->width) / 2 ;}if(frame->height <= frameSize.height){zero_H = (frameSize.height - frame->height) / 2 ;}CvRect roi =cvRect(zero_W, zero_H, frame->width, frame->height);cvSetImageROI(temp_frame,roi) ;cvResize(frame, temp_frame);cvResetImageROI(temp_frame) ;detectAndDraw( cv::Mat(temp_frame) , cascade, nestedCascade,2,0 );cvWriteFrame(writer,temp_frame); cvShowImage("Pic2avi", temp_frame); cvWaitKey(100);frame = NULL ;temp_frame = NULL ;} while (!_findnext(findResult2, &fileInfo2)); _findclose(findResult2); return 0; } void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip ) {int i = 0;double t = 0;//建立用于存放人臉的向量容器vector<Rect> faces, faces2;//定義一些顏色,用來標示不同的人臉const static Scalar colors[] = { CV_RGB(0,0,255),CV_RGB(0,128,255),CV_RGB(0,255,255),CV_RGB(0,255,0),CV_RGB(255,128,0),CV_RGB(255,255,0),CV_RGB(255,0,0),CV_RGB(255,0,255)} ;//建立縮小的圖片,加快檢測速度//nt cvRound (double value) 對一個double型的數進行四舍五入,并返回一個整型數!Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );//轉成灰度圖像,Harr特征基于灰度圖cvtColor( img, gray, CV_BGR2GRAY );//改變圖像大小,使用雙線性差值resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );//變換后的圖像進行直方圖均值化處理equalizeHist( smallImg, smallImg );//程序開始和結束插入此函數獲取時間,經過計算求得算法執行時間t = (double)cvGetTickCount();//檢測人臉//detectMultiScale函數中smallImg表示的是要檢測的輸入圖像為smallImg,faces表示檢測到的人臉目標序列,1.1表示//每次圖像尺寸減小的比例為1.1,2表示每一個目標至少要被檢測到3次才算是真的目標(因為周圍的像素和不同的窗口大//小都可以檢測到人臉),CV_HAAR_SCALE_IMAGE表示不是縮放分類器來檢測,而是縮放圖像,Size(30, 30)為目標的//最小最大尺寸cascade.detectMultiScale( smallImg, faces,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30));//如果使能,翻轉圖像繼續檢測if( tryflip ){flip(smallImg, smallImg, 1);cascade.detectMultiScale( smallImg, faces2,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++ ){faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));}}t = (double)cvGetTickCount() - t;// qDebug( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ){Mat smallImgROI;vector<Rect> nestedObjects;Point center;Scalar color = colors[i%8];int radius;double aspect_ratio = (double)r->width/r->height;if( 0.75 < aspect_ratio && aspect_ratio < 1.3 ){//標示人臉時在縮小之前的圖像上標示,所以這里根據縮放比例換算回去center.x = cvRound((r->x + r->width*0.5)*scale);center.y = cvRound((r->y + r->height*0.5)*scale);radius = cvRound((r->width + r->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}elserectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),color, 3, 8, 0);if( nestedCascade.empty() )continue;smallImgROI = smallImg(*r);//同樣方法檢測人眼nestedCascade.detectMultiScale( smallImgROI, nestedObjects,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_DO_CANNY_PRUNING//|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ ){center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);radius = cvRound((nr->width + nr->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}}cv::imshow( "result", img ); }代碼中,
CvVideoWriter* writer = cvCreateVideoWriter("output.avi",CV_FOURCC('X','V','I','D'),frameRate,frameSize);這部分用來設置生成的avi視頻的各個參數。
注釋中的1和2就是從文件夾中讀取某一后綴的全部文件。
?
轉載于:https://www.cnblogs.com/betterwgo/p/6561444.html
總結
以上是生活随笔為你收集整理的OpenCV人脸检测并把图片写成avi视频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈对三大框架的理解
- 下一篇: struts2.0标签库