OpenCV在影象上摳取指定區域平移、縮放的影象
阿新 • • 發佈:2019-02-16
#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; }