图像批量缩放(改名)小工具(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; }