1. 程式人生 > >OpenCV在影象上摳取指定區域平移、縮放的影象

OpenCV在影象上摳取指定區域平移、縮放的影象

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>
#include <string>

using namespace std;
using namespace cv;
#define IMAGENUM 105
#define OBJNUM 168
struct FRAME
{
	int framenum;
	int objnum;
	int startx;
	int starty;
	int width;
	int height;
} frameInfo[IMAGENUM];
Rect new_location(Rect rect, struct FRAME newframe, Mat src, int casenum)
{
	switch(casenum)
	{
		case 0://原位置
			rect.x = newframe.startx;
			rect.y = newframe.starty;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 1://左移10%
			rect.x = newframe.startx - newframe.width*0.1;
			rect.y = newframe.starty;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 2://右移10%
			rect.x = newframe.startx + newframe.width*0.1;
			rect.y = newframe.starty;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 3://上移10%
			rect.x = newframe.startx;
			rect.y = newframe.starty - newframe.height*0.1;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 4://下移10%
			rect.x = newframe.startx;
			rect.y = newframe.starty + newframe.height*0.1;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 5://左上角
			rect.x = newframe.startx - newframe.width*0.05;
			rect.y = newframe.starty - newframe.height*0.05;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 6://左下角
			rect.x = newframe.startx - newframe.width*0.1;
			rect.y = newframe.starty + newframe.height*0.1;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 7://右上角
			rect.x = newframe.startx + newframe.width*0.1;
			rect.y = newframe.starty - newframe.height*0.1;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 8://右下角
			rect.x = newframe.startx + newframe.width*0.1;
			rect.y = newframe.starty + newframe.height*0.1;
			rect.width = newframe.width;
			rect.height = newframe.height;
			break;
		case 9://縮小
			rect.x = newframe.startx + newframe.width*0.05;
			rect.y = newframe.starty + newframe.height*0.05;
			rect.width = newframe.width*0.9;
			rect.height = newframe.height*0.9;
			break;
		case 10://放大
			rect.x = newframe.startx - newframe.width*0.05;
			rect.y = newframe.starty - newframe.height*0.05;
			rect.width = newframe.width*1.1;
			rect.height = newframe.height*1.1;
			break;
		default: 
			break;
	}
	
	if(rect.x < 0)
		rect.x = 0;
	if(rect.y < 0)
		rect.y = 0;
	if(rect.x + rect.width > src.cols)
		rect.width = src.cols - rect.x;
	if(rect.y + rect.height > src.rows)
		rect.height = src.rows - rect.y;
	return rect;
}
int _tmain(int argc, _TCHAR* argv[])
{
	int imageCount = 0;
	int needframe = 105; //可設定一共取多少幀
	int interval = IMAGENUM/needframe;
	int t = readtxt(interval);
	if (!t)
	{
		cout<<"讀取真實值完成"<<endl;
	}
	
	string srcImg;
	char saveName[256];

	ifstream fin("ThreeVideoList.txt");
	int temp = 0;
	for(int num=-1; num<IMAGENUM;)
	{
		Mat src;
		if ((num-frameInfo[temp].framenum))
		{
			num++;
			getline(fin,srcImg);
			cout<<"處理:"<<srcImg<<endl;
			srcImg = "E:\\資料集\\影象幀\\ThreeVideoSelected\\" + srcImg;
		}
		src = imread(srcImg);
		resize(src,src,Size(1280,720));
		if (!(num-frameInfo[temp].framenum))
		{
			for (int casenum=0;casenum<11;casenum++) //通過casenum可以控制所摳取的影象是經過了何種變換
			{
				Rect rect;
				rect = new_location(rect,frameInfo[temp],src,casenum);
				Mat image = src(rect);
				sprintf(saveName,"E:\\資料集\\目標區域影象\\目標區域變換\\ThreeVideo\\%03d.jpg",imageCount++);
				imwrite(saveName,image);
			}
			temp++;
		}
	}
	return 0;
}