OpenCV中将一幅图平均分成N*M份,适合SVM+HOG训练的负样本采集

刚刚开始学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,把读取路径和存储路径都定义了,然后就可以多张图处理,储存就不用担心命名重复导致覆盖了。


猜你喜欢

转载自blog.csdn.net/qq_25220319/article/details/72597948