훈련 견본 에 대한 진가 표시
참조 코드:
#include "stdafx.h"
#include "windows.h"
#include <vector>
#include <string>
#include "opencv.hpp"
#include "iostream"
#include "fstream"
using namespace std;
typedef std::vector<std::string> file_lists;
static int str_compare(const void *arg1, const void *arg2)
{
return strcmp((*(std::string*)arg1).c_str(), (*(std::string*)arg2).c_str());// arg1 and arg2
}
file_lists ScanDirectory(const std::string &path, const std::string &extension)
{
WIN32_FIND_DATA wfd;//WIN32_FIND_DATA:Contains information about the file that is found by the
//FindFirstFile, FindFirstFileEx, or FindNextFile function
HANDLE hHandle;
string searchPath, searchFile;
file_lists vFilenames;
int nbFiles = 0;
searchPath = path + "/*" + extension;
hHandle = FindFirstFile(searchPath.c_str(), &wfd);//Searches a directory for a file or subdirectory
//with a name that matches a specific name
if (INVALID_HANDLE_VALUE == hHandle)
{
fprintf(stderr, "ERROR(%s, %d): Cannot find (*.%s)files in directory %s/n",
__FILE__, __LINE__, extension.c_str(), path.c_str());
exit(0);
}
do
{
//. or ..
if (wfd.cFileName[0] == '.')
{
continue;
}
// if exists sub-directory
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//dwFileAttributes:The file attributes of a file
{
//FILE_ATTRIBUTE_DIRECTORY:The handle identifies a directory
continue;
}
else//if file
{
searchFile = path + "/" + wfd.cFileName;
vFilenames.push_back(searchFile);
nbFiles++;
}
}while (FindNextFile(hHandle, &wfd));//Call this member function to continue a file search begun
//with a call to CGopherFileFind::FindFile
FindClose(hHandle);//Closes a file search handle opened by the FindFirstFile, FindFirstFileEx,
//or FindFirstStreamW function
// sort the filenames
qsort((void *)&(vFilenames[0]), (size_t)nbFiles, sizeof(string), str_compare);//Performs a quick sort
return vFilenames;
}
bool rBtnDown = false;
const int ptsSize = 4;
CvPoint pts[ptsSize];
int ptsCount = 0;
void mouseOn(int e,int x,int y,int flags,void* param)
{
if (e == CV_EVENT_LBUTTONDOWN)
{
pts[ptsCount++] = cvPoint(x,y);
}
else if (e == CV_EVENT_RBUTTONDOWN)
{
rBtnDown = true;
}
}
void GetTrainSample()
{
string folderIn, fileExt, folderOut;
ifstream fileIn;
fileIn.open("config.ini", ios::in);
if (!fileIn)
{
cout<<"config.ini open error"<<endl;
system("pause");
exit(-1);
}
char str[512];
memset(str, '\0', 512*sizeof(char));
fileIn>>str;
folderIn = str;
memset(str, '\0', 512*sizeof(char));
fileIn>>str;
fileExt = str;
memset(str, '\0', 512*sizeof(char));
fileIn>>str;
folderOut = str;
file_lists files = ScanDirectory(folderIn, fileExt);
int size = files.size();
cout<<" :"<<size<<endl;
string fileName;
string path;
string ptsName;
int len;
cvNamedWindow("img", 0);
cvSetMouseCallback("img", mouseOn);
for (int i=0; i<size; i++)
{
cout<<i+1<<"/"<<size<<endl;
int idx = files[i].find_last_of('\/');
fileName.clear();
fileName = files[i].substr(idx+1, files[i].length()-idx);
path = folderOut + "/"+ fileName;
ptsName = path;
len = ptsName.length();
if (ptsName[len-4] = '.')
{
ptsName[len-1] = 't';
ptsName[len-2] = 'x';
ptsName[len-3] = 't';
}
else
{
ptsName[len-1] = '\0';
ptsName[len-2] = 't';
ptsName[len-3] = 'x';
ptsName[len-4] = 't';
}
ofstream fileOut;
fileOut.open(ptsName.c_str(), ios::out);
IplImage* pImg = cvLoadImage(files[i].c_str());
if (!pImg)
{
cout<<"img load error, fileName: "<<files[i].c_str();
continue;
}
cvSaveImage(path.c_str(), pImg);
while(!rBtnDown)
{
cvShowImage("img", pImg);
cvWaitKey(1);
if (ptsCount == ptsSize)
{
int minX,minY,maxX,maxY;
minX = maxX = pts[0].x;
minY = maxY = pts[0].y;
for (int j=1; j<ptsSize; j++)
{
minX = minX<pts[j].x ? minX:pts[j].x;
minY = minY<pts[j].y ? minY:pts[j].y;
maxX = maxX>pts[j].x ? maxX:pts[j].x;
maxY = maxY>pts[j].y ? maxY:pts[j].y;
}
fileOut<<minX<<" "<<minY<<" "<<maxX<<" "<<maxY<<endl;
ptsCount = 0;
cvRectangle(pImg, cvPoint(minX,minY), cvPoint(maxX,maxY), CV_RGB(255,0,0));
cvShowImage("img", pImg);
cvWaitKey(1);
}
}
rBtnDown = false;
ptsCount = 0;
cvReleaseImage(&pImg);
fileOut.close();
}
}
void Usage()
{
cout<<"config.ini "<<endl;
cout<<" config.ini :
;
config.ini :
c:\\inputDir
.bmp
D:\\result"<<endl;
cout<<endl;
cout<<" :"<<endl;
cout<<" 4 , , "<<endl;
cout<<"//////////////////////////////////////////////////////////////////////"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Usage();
GetTrainSample();
system("pause");
return 0;
}
설명:
(1) 이상 코드 는 opencv 가 필요 합 니 다. 관련 lib 와 dll 을 자체 적 으로 설정 하 십시오.
(2) 상기 코드 는 컴 파일 과정 에서 "Unicode" 문자 집합 을 선택 하지 마 십시오. 예 를 들 어 VS 2008, VS 2010 에서 다음 과 같이 설정 하 십시오. 항목 -- > 속성 -- > 일반 -- > 문자 집합 -- > 설정 되 지 않 았 습 니 다.
(3) 실행 가능 한 파일 이 있 는 경 로 는 config. ini 파일 을 만 드 십시오. 이 파일 은 세 줄 을 포함 합 니 다.
그림 경로 입력
그림 접미사 이름
출력 경로;
config. ini 참조 설정:
E:\Images .bmp E:\result
(4) config. ini 의 입 출력 경 로 는 중국어 경 로 를 포함 하지 마 십시오. 오류 가 발생 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.