刚刚开始学OpenCV,这个程序是自己写的,运行环境是VS2010+OpenCV2.4.9;
因为做SVM+HOG对人体头部进行检测,自己偷懒,而且还不会用鼠标选ROI,就用ps,花了一整天,收集了1000+个正样本。感觉脑子都机械了!!!负样本需要3000-,完全没心情搞,就编个程,让电脑自己做。
这个程序用的 cvLoadImage读图,所以只有在同一个目录下的图片能读取。看有人用txt写了很多路径,然后一行一行的读,这个程序的改进就往这个方向了,不过这里先把程序发了,造福所有刚进opencv的同学。
#include <iostream> #include "opencv2/opencv.hpp" #include "iostream" #include <fstream> #include <windows.h> #include <string> using namespace cv; using namespace std; int main() { //读取同一目录下的图片// IplImage *img = cvLoadImage("1.jpg"); IplImage *sub_image = nullptr; //1920=128*15;1080=128*8+56// //定义矩形选框大小这里,高num_height=128;宽num_width=128// int num_height=128,num_width=128; char save_file[200]; for(int i=1;i<=8;i++) { for(int j=1;j<=15;j++) { CvRect rc = cvRect((j-1)*num_width,(i-1)*num_height,num_width,num_height); sub_image = cvCreateImage(cvSize( rc.width, rc.height),IPL_DEPTH_8U,3); //cvDrawRect(img,cvPoint(rc.x,rc.y),cvPoint(rc.x+rc.width,rc.y + rc.height),cvScalar(255,255,0),8,0); //目标区域 cvSetImageROI(img,rc); cvCopy(img,sub_image); cvResetImageROI(img); cvNamedWindow("src",0); cvShowImage("src",img); cvNamedWindow("sub",0); cvShowImage("sub",sub_image); //存储路径及存储命名 sprintf(save_file, "H:/avi_for_opencv/sample-neg/%d_%d.jpg", i,j); cvSaveImage(save_file,sub_image); cvWaitKey(20); } } return 0; }
记得自己的图片的尺寸和自己需要的sub_image的尺寸,这里顺便把存储视频每一帧图像的程序给了,两个共用更搭的。
记得用这个程序需要预编译开头,建立项目的时候就不要点空项目了。
这个程序时从其他网友那里转的:http://blog.csdn.net/timidsmile/article/details/8283319
// FrametoImg.cpp : 定义控制台应用程序的入口点。 #include"stdafx.h" #include <stdio.h> #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]) { CvCapture* capture = cvCaptureFromAVI("H:\\avi_for_opencv\\3_1_0.avi"); int i = 0; IplImage* img = 0; char image_name[25]; cvNamedWindow( "TestSample"); //读取和显示 while(1) { img = cvQueryFrame(capture); //获取一帧图片 if(img == NULL) break; cvShowImage( "TestSample", img ); //将其显示 char key = cvWaitKey(20); sprintf(image_name, "%s%d%s", "H:\\avi_for_opencv", ++i, ".jpg");//保存的图片名 cvSaveImage( image_name, img); //保存一帧图片 } cvReleaseCapture(&capture); cvDestroyWindow("TestSample"); return 0; }
不过他说的很对,他的程序溢出了
接下来就尝试写两个txt,把读取路径和存储路径都定义了,然后就可以多张图处理,储存就不用担心命名重复导致覆盖了。