您的位置:首页 > 运维架构

OpenCV读取序列图片(二)

2016-04-18 14:54 309 查看
虽然OpenCV的VideoCapture可以读取序列图片,但是有时候不好用,自己写了一个类来专门读取序列图片。

图片的命名方式为img000.png img001.png img010.png img100.png img999.png

数字位数一定要相同,用0补全,可以没有前缀img

批量修改文件名可以用2345看图王软件,虽然会弹广告,但是挺好用

#pragma once
#include <string>
#include <sstream>
#include <iostream>
#include <opencv2/opencv.hpp>

class SeqCapture
{
public:
SeqCapture(std::string inputFile);
bool read(cv::Mat& input);		//加载图片并检查是否读取完毕

private:
cv::Mat img;

/*  假设文件为  D:\\Datasets\\img000.png  */
std::string firstFilePathName;	//第一幅图片的路径+名称	D:\\Datasets\\img000.png
std::string path;				//文件路径+前缀			D:\\Datasets\\img
std::string imgFormat;			//图片格式				.png
unsigned int nameWidth;			//获取文件名数字位长度	000为3位
unsigned int fileNum;			//第一幅图片的数字编号	0

void getPath();				//获取文件名路径+前缀
void getImgFormat();		//获取文件名格式
void getFirstFileNum();		//获取第一个文件的数字编号
void getNameWidth();		//获取文件名数字位长度
};
#include "SeqCapture.h"

unsigned int mark1 = 0;		//最后一个'\'位置
unsigned int mark2 = 0;		//如果有前缀的话,img000.png,g后面第一个数字的位置
unsigned int mark3 = 0;		//'.'号位置
unsigned int mark4 = 0;		//如果有非0位的话,数字位的第一个非0位
bool mark5 = false;			//判断是否有非0位

SeqCapture::SeqCapture(std::string inputFile)
{
firstFilePathName = inputFile;
getPath();
getImgFormat();
getFirstFileNum();
getNameWidth();
}

void SeqCapture::getPath()
{
for (unsigned int i = 0; i < firstFilePathName.size(); ++i)
if (firstFilePathName[i] == '\\')
mark1 = i;

if ((firstFilePathName[mark1+1] >= '0') && (firstFilePathName[mark1+1] <= '9'))
path.assign(firstFilePathName, 0, mark1+1);
else
{
for (unsigned int i = (mark1+1); i < firstFilePathName.size(); ++i)
if ((firstFilePathName[i] >= '0') && (firstFilePathName[i] <= '9'))
{
mark2 = i;
break;
}
path.assign(firstFilePathName, 0, mark2);
}
}

void SeqCapture::getImgFormat()
{
for (unsigned int i = 0; i < firstFilePathName.size(); ++i)
if (firstFilePathName[i] == '.')
mark3 = i;
unsigned int mark_temp = firstFilePathName.size() - mark3;
imgFormat.assign(firstFilePathName, mark3, mark_temp);
}

void SeqCapture::getFirstFileNum()
{
if (mark2 != 0)
{
for (unsigned int i = mark2; i < mark3; ++i)
{
if (firstFilePathName[i] != '0')
{
mark4 = i;
break;
}
else if (i == (mark3-1))
{
mark5 = true;
break;
}
}
}
else
{
for (unsigned int i = (mark1+1); i < mark3; ++i)
{
if (firstFilePathName[i] != '0')
{
mark4 = i;
break;
}
else if (i == (mark3-1))
{
mark5 = true;
break;
}
}
}

std::stringstream ss;
if (mark5)
ss << '0';
else
for (unsigned int i = mark4; i < mark3; ++i)
ss << firstFilePathName[i];

ss >> fileNum;
}

void SeqCapture::getNameWidth()
{
if (mark2 == 0)
nameWidth = mark3 - mark1 - 1;
else
nameWidth = mark3 - mark2;
}

bool SeqCapture::read(cv::Mat& input)
{
std::stringstream ss, temp;
std::string sNameWidth;

temp << fileNum;
temp >> sNameWidth;

if (sNameWidth.size() < nameWidth)
{
ss << path;
for (unsigned int i = 0; i < (nameWidth-sNameWidth.size()); ++i)
ss << '0';
ss << fileNum++ << imgFormat;
}
else
ss << path << fileNum++ << imgFormat;

img = cv::imread(ss.str());
if (img.empty())
return false;
else
{
input = img;
return true;
}
}
#include "SeqCapture.h"
using namespace cv;
using namespace std;

int histSize[1] = {256};
float hranges[2] = {0, 255};
const float* ranges[1] = {hranges};
int channels[1] = {0};

int main()
{
SeqCapture seq("E:\\Datasets\\TrackingDataset_TV77\\Babenko\\girl\\img000.png");
Rect rect(135, 65, 90, 90);

Mat frame, frameHSV, imgROI, dstHist, backproj;

seq.read(frame);
cvtColor(frame, frameHSV, COLOR_RGB2HSV);
imgROI = frameHSV(rect);
calcHist(&imgROI, 1, channels, Mat(), dstHist, 1, histSize, ranges);
normalize(dstHist, dstHist, 0.0, 1.0, NORM_MINMAX);

rectangle(frame, rect, Scalar(0, 0, 255));
imshow("Frame", frame);
waitKey(0);

while (seq.read(frame))
{
cvtColor(frame, frameHSV, COLOR_RGB2HSV);
calcBackProject(&frameHSV, 1, channels, dstHist, backproj, ranges, 255.0);

TermCriteria criteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, 0.001);
meanShift(backproj, rect, criteria);

imgROI = frameHSV(rect);
calcHist(&imgROI, 1, channels, Mat(), dstHist, 1, histSize, ranges);
normalize(dstHist, dstHist, 0.0, 1.0, NORM_MINMAX);

rectangle(frame, rect, Scalar(0, 255, 0));
imshow("Frame", frame);

waitKey(0);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: