OpenCV读取序列图片(二)
2016-04-18 14:54
309 查看
虽然OpenCV的VideoCapture可以读取序列图片,但是有时候不好用,自己写了一个类来专门读取序列图片。
图片的命名方式为img000.png img001.png img010.png img100.png img999.png
数字位数一定要相同,用0补全,可以没有前缀img
批量修改文件名可以用2345看图王软件,虽然会弹广告,但是挺好用
图片的命名方式为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; }
相关文章推荐
- 面向业务的立体化高可用架构设计
- XAMPP(集成PHP+MySQL+Apache)修改Apache默认工程位置
- 整理包--autopackstepCompile-UFT.bat
- linux shell 字符串操作(长度,查找,替换)详解
- VMware Player 7 下扩展 CentOS 7 硬盘空间
- linux命令学习使用记录
- Apache Maven 入门篇
- 关于ubuntu openssh-server 安装失败问题
- ajax.open第三个参数简介
- 基于CentOS的MySQL学习补充三--使用Shell批量创建数据库表
- 详解Linux2.6内核中基于platform机制的驱动模型
- VirtualAlloc和VirtualCopy的蕴含知识点
- Linux环境下段错误的产生原因及调试方法小结
- AML_看门狗驱动分析
- OpenGL使用libPng读取png图片
- 在Eclipse中中tomcat会启动两次
- xshell的快捷键(非常实用)
- centos MYSQL 主从同步配置
- 使用zsh的十大优点
- yum源的配置(centos6.5)