OpenCV图像文件批量读取编程实例

OpenCV编程实例之图像文件批量读取。

本博文摘录《OpenCV图像处理编程实例》2.4章节,更详细的内容请参考本书。

在进行图片序列处理时,我们常常需要读取文件夹下的每一个图片,然后再进行分析处理,因此需要对文件名连续及无规则情况分开讨论。对于文件名连续的情况,文件读取就简单得多,可以利用sprintf函数实现在窗口中连续读取同一文件夹下的图片序列,而对于无规则的情况则可以采用基于C++下WIN32_ FIND_DATA文件的读取方式。

2.4.6 图像批量读取——规则

文件名连续情况下的读取如代码2-32所示。

 // 功能:代码 2-32 文件名连续情况下
 // 作者:朱伟 zhu1988wei@163.com
 // 来源:《OpenCV图像处理编程实例》
 // 博客:http://blog.csdn.net/zhuwei1988
 // 更新:2016-8-1
 // 说明:版权所有,引用或摘录请联系作者,并按照上面格式注明出处,谢谢。//
 #include <iostream>
 #include <stdio.h>
 #include <stdlib.h>
 #include <opencv2/highgui/highgui.hpp>
 #include <opencv2/imgproc/imgproc.hpp>
 using namespace cv;
 using namespace std;
 int main()
 {
 // 定义相关参数
 const int num = 4;
 char fileName[50];
 char windowName[50];
 cv::Mat srcImage;
 for (int i = 1; i <= num; i++)
 {
 // sprintf读入指定路径下图片序列
 sprintf_s(fileName, "..\\images\\test\\1 (%d).jpg", i);
 sprintf_s(windowName, "NO%d", i);
 // 按照图像文件名读取
 srcImage = cv::imread(fileName);
 if (!srcImage.data)
 {
 std::cout << "No data!" << std::endl;
 return -1;
 }
 cv::namedWindow(windowName);
 cv::imshow(windowName, srcImage);
 std::cout << "NO: " << i << std::endl;
 //cv::waitKey(0);
 /* 该处可以添加处理步骤 */
 }
 cv::waitKey(0);
 return 0;
 }

第16行代码利用sprintf将对应的图像文件路径转换为char*,在这种文件名连续的时候可以选中文件夹中的所有图像文件,然后用鼠标右键选定并重命名,键入1后,文件夹的所有文件自动命名为1 (k).jpg,其中k取值为1,2……然后就可以根据本方法进行批量读取了。

2.4.7 图像批量读取——无规则

文件名无规则的情况读取如代码2-33所示。

 // 功能:代码 2-33 文件名无规则情况读取
 // 作者:朱伟 zhu1988wei@163.com
 // 来源:《OpenCV图像处理编程实例》
 // 博客:http://blog.csdn.net/zhuwei1988
 // 更新:2016-8-1
 // 说明:版权所有,引用或摘录请联系作者,并按照上面格式注明出处,谢谢。//
 #include <opencv2/core/core.hpp>
 #include <opencv2/highgui/highgui.hpp>
 #include <opencv2/imgproc/imgproc.hpp>
 #include <iostream>
 #include <stdio.h>
 #include <windows.h>
 using namespace std;
 // LPCWSTR转string
 std::string WChar2Ansi(LPCWSTR pwszSrc)
 {
 int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);

 if (nLen <= 0) return std::string("");

 char* pszDst = new char[nLen];
 if (NULL == pszDst) return std::string("");

 WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
 pszDst[nLen - 1] = 0;

 std::string strTemp(pszDst);
 delete[] pszDst;

 return strTemp;
 }

 // 利用winWIN32_FIND_DATA读取文件下的文件名
 void readImgNamefromFile(char* fileName, vector <string> &imgNames)
 {
 // vector清零 参数设置
 imgNames.clear();
 WIN32_FIND_DATA file;
 int i = 0;
 char tempFilePath[MAX_PATH + 1];
 char tempFileName[50];
 // 转换输入文件名
 sprintf_s(tempFilePath, "%s/*", fileName);
 // 多字节转换
 WCHAR wstr[MAX_PATH] = { 0 };
 MultiByteToWideChar(CP_ACP, 0, tempFilePath, -1, wstr, sizeof(wstr));
 // 查找该文件待操作文件的相关属性读取到WIN32_FIND_DATA
 HANDLE handle = FindFirstFile(wstr, &file);
 if (handle != INVALID_HANDLE_VALUE)
 {
  FindNextFile(handle, &file);
  FindNextFile(handle, &file);
  // 循环遍历得到文件夹的所有文件名
  do
  {
   sprintf(tempFileName, "%s", fileName);
   imgNames.push_back(WChar2Ansi(file.cFileName));
   imgNames[i].insert(0, tempFileName);
   i++;
  } while (FindNextFile(handle, &file));
 }
 FindClose(handle);
 }
 int main()
 {
 // 设置读入图像序列文件夹的路径
 char* fileName = "..\\images\\test\\";
 std::vector <string> imgNames;
 // 获取对应文件夹下所有文件名
 readImgNamefromFile(fileName, imgNames);
 // 遍历对应文件夹下所有文件名
 for (int i = 0; i < imgNames.size(); i++)
 {
  cv::Mat img = cv::imread(imgNames[i]);
  if (!img.data)
   return -1;
  /* 可添加图像处理算法code*/
  cv::imshow("im", img);
  cv::waitKey(0);
 }
 return 0;
 }

利用winWIN32_FIND_DATA读取文件夹下文件的思路:首先转换文件夹名,利用FindFirstFile获取当前文件夹名的句柄;然后遍历当前文件夹名下的所有文件,将得到的所有文件名称转换后赋值于图像文件向量;最后遍历完当前文件下的所有文件,生成相应图像文件索引名称,用于文件夹中所有图像文件的读取,在读取单个图像文件后可进行相关的图像处理操作。

您可能感兴趣的文章:

  • 基于OpenCV的PHP图像人脸识别技术
  • 实现opencv图像裁剪分屏显示示例
  • 使用opencv拉伸图像扩大分辨率示例
  • 详解使用JavaCV/OpenCV抓取并存储摄像头图像
  • OpenCV图像分割中的分水岭算法原理与应用详解
  • Opencv实现用于图像分割分水岭算法
(0)

相关推荐

  • 使用opencv拉伸图像扩大分辨率示例

    使用OPENCV图像处理库,拉伸图像扩大分辨率 复制代码 代码如下: //缩放图像文件#include <opencv2/opencv.hpp>using namespace std;//隐藏控制台窗口#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")int main(){ const char *pstrImageName = &qu

  • Opencv实现用于图像分割分水岭算法

    目标 • 使用分水岭算法基于掩模的图像分割 • 学习函数: cv2.watershed() 原理   任何一幅灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷.我们向每一个山谷中灌不同颜色的水,随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在水汇合的地方构建起堤坝.不停的灌水,不停的构建堤坝直到所有的山峰都被水淹没.我们构建好的堤坝就是对图像的分割.这就是分水岭算法的背后哲理.   但是这种方法通常都会得到过度分割的结果

  • 基于OpenCV的PHP图像人脸识别技术

    openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全.本文重点是介绍如何使用php来调用其中的局部的功能.人脸侦查技术只是openCV一个应用分支. 1.安装 从源代码编译成一个动态的so文件. 1.1.安装 OpenCV (OpenCV 1.0.0) 下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948 #tar xvzf OpenCV-1.0.0.ta

  • 详解使用JavaCV/OpenCV抓取并存储摄像头图像

    本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同时保存缓冲区的图像到磁盘文件中.点击JFrame关闭按钮可以退出程序. 实现: import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; imp

  • 实现opencv图像裁剪分屏显示示例

    使用OPENCV图像处理库,将图片裁剪分屏显示 复制代码 代码如下: //#include "stdafx.h"#include <opencv2/opencv.hpp> //#include <opencv2/imgproc/imgproc.hpp>//#include <opencv2/highgui/highgui.hpp>#include <iostream>#include <vector>using namespa

  • OpenCV图像分割中的分水岭算法原理与应用详解

    图像分割是按照一定的原则,将一幅图像分为若干个互不相交的小局域的过程,它是图像处理中最为基础的研究领域之一.目前有很多图像分割方法,其中分水岭算法是一种基于区域的图像分割算法,分水岭算法因实现方便,已经在医疗图像,模式识别等领域得到了广泛的应用. 1.传统分水岭算法基本原理 分水岭比较经典的计算方法是L.Vincent于1991年在PAMI上提出的[1].传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一像素的灰度值表示该点的海

  • OpenCV图像文件批量读取编程实例

    OpenCV编程实例之图像文件批量读取. 本博文摘录<OpenCV图像处理编程实例>2.4章节,更详细的内容请参考本书. 在进行图片序列处理时,我们常常需要读取文件夹下的每一个图片,然后再进行分析处理,因此需要对文件名连续及无规则情况分开讨论.对于文件名连续的情况,文件读取就简单得多,可以利用sprintf函数实现在窗口中连续读取同一文件夹下的图片序列,而对于无规则的情况则可以采用基于C++下WIN32_ FIND_DATA文件的读取方式. 2.4.6 图像批量读取--规则 文件名连续情况下的

  • OPENCV批量读取图片实现方法

    如下所示: #include<opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { int num=4;//读取图片数量: char filename[100]; char windowname[100]; IplImage* pScr; unsigned char *Readfigsmethod1(int num);// 读入num个图片 { for (int i = 1; i <= num;

  • 使用python批量读取word文档并整理关键信息到excel表格的实例

    目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下所示) 方便后面建立电子数据库 从而使得其他人可以迅速地搜索到相关记录 据说"人生苦短,我用python" 所以决定用python从docx文档中提取文件头的信息 然后把信息更新到一个xls电子表格中,像下面这样(直接po结果好了) 而且点击文件路径可以直接打开对应的文件(含超链接) 代码

  • Python实现批量读取图片并存入mongodb数据库的方法示例

    本文实例讲述了Python实现批量读取图片并存入mongodb数据库的方法.分享给大家供大家参考,具体如下: 我的图片放在E:\image\中,然后使用python将图片读取然后,显示一张,存入取一张(可以注释掉显示图片的语句),通过Gridfs的方式存入图片.代码如下: # --* coding=utf-8 *-- from cStringIO import StringIO from pymongo import MongoClient import gridfs import os imp

  • Python实现批量读取word中表格信息的方法

    本文实例讲述了Python实现批量读取word中表格信息的方法.分享给大家供大家参考.具体如下: 单位收集了很多word格式的调查表,领导需要收集表单里的信息,我就把所有调查表放一个文件里,写了个python小程序把所需的信息打印出来 #coding:utf-8 import os import win32com from win32com.client import Dispatch, constants from docx import Document def parse_doc(f):

  • 从零学python系列之数据处理编程实例(二)

    在上一节从零学python系列之数据处理编程实例(一)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年月 数据准备:分别建立四个文本文件 james2.txt     James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22 julie2.txt        Julie Jones,2002-8-17,2.59,2.11

  • Kafka简单客户端编程实例

    今天,我们给大家带来一篇如何利用Kafka的API进行客户端编程的文章,这篇文章很简单,就是利用Kafka的API创建一个生产者和消费者,生产者不断向Kafka写入消息,消费者则不断消费Kafka的消息.下面是具体的实例代码. 一.创建配置类Config 这个类很简单,只是存放了两个常量,一个是话题TOPIC,一个是线程数THREADS package com.lya.kafka; /** * 配置项 * @author liuyazhuang * */ public class Config

  • python批量读取txt文件为DataFrame的方法

    我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要用到glob模块,这个python内置的模块可以说是非常的好用. glob.glob('*.txt') 得到如下结果: all.txt是我最后得到的结果文件.可以见返回的是一个包含txt文件名称的列表,当然如果你的文件夹下面只有txt文件,那么你用os.listdir()可以得到一个一样的列表 然后

  • python并发和异步编程实例

    关于并发.并行.同步阻塞.异步非阻塞.线程.进程.协程等这些概念,单纯通过文字恐怕很难有比较深刻的理解,本文就通过代码一步步实现这些并发和异步编程,并进行比较.解释器方面本文选择python3,毕竟python3才是python的未来,并且python3用原生的库实现协程已经非常方便了. 1.准备阶段 下面为所有测试代码所需要的包 #! python3 # coding:utf-8 import socket from concurrent import futures from selecto

  • python批量读取文件名并写入txt文件中

    本文实例为大家分享了python批量读取文件名并写入txt中的具体代码,供大家参考,具体内容如下 先说下脚本使用的环境吧,在做项目的过程中需要动态加载图片,使用Unity的Resources.Load方法,但是百十张图片怎么能一 一写下他们的名字作为加载的路径呢?总不能一个一个编辑后存到数组中吧,(虽然我最初是这么做的).所以必须有一个批量的工具,必须的. 于是乎激发了我的灵感,下面看代码.备注少,不动的给我留言,我会及时回复的. #coding=utf-8 import sys import

随机推荐