使用OpenCV读、操作、写图像并与bash合作对某个目录下所有图像进行类似处理
我门要对某个目录下所有图像文件进行统一处理,如果图像的数量过多,那么手动地一张张处理就会显得有些麻烦。本文使用OpenCV和bash来完成我们指定的任务。
任务
将目录A下的所有统一格式的jpg图像变成统一尺寸的图像,输出到目录B中。A目录下图像的宽度和高度需要去掉最后一列、最后一行,并且使得输出图像的高度小于宽度。
技术
OpenCV读取图像;访问图像中的元素;OpenCV写图像到磁盘。
BASH扫描每个输入图像;确定输出图像名称。
OpenCV对图像进行处理
源代码如下:
#include <cassert> #include <iostream> #include <vector> #include <string> #include <algorithm> #include "cv.hpp" #include "opencv2/opencv.hpp" //#include "opencv2/core.hpp" #include "opencv2/highgui/highgui_c.h" using namespace std; using namespace cv; int main(int argc, char **argv) { if (3 != argc){ cerr << "input error\n"; cerr << "Usage : " << argv[0] << " <input image> <output directory>" << endl; return -1; } // reading the input image Mat oim = imread(argv[1]); if (oim.empty()) return -1; const int rows = oim.rows; const int cols = oim.cols; Mat fim(rows-1, cols-1, CV_8UC3); for (int r = 0; r < (rows-1); r++){ for (int c = 0; c < (cols-1); c++){ fim.at<Vec3b>(r,c) = oim.at<Vec3b>(r,c); }} // rotate 90' Mat lim; if (rows > cols){ lim.create(cols-1, rows-1, CV_8UC3); for (int r = 0; r < (cols-1); r++){ for (int c = 0; c < (rows-1); c++){ lim.at<Vec3b>(r,c) = fim.at<Vec3b>(c,cols-2-r); }} } else{ lim = fim; } // saving string filename(argv[1]); int dirpos = filename.find_last_of('/'); if (string::npos == dirpos){ dirpos = 0; } else{ dirpos += 1; } string wfn = &filename[dirpos]; string outdir = string(argv[2]); string outfile = outdir+string("/")+wfn; vector<int> compression_params; compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); compression_params.push_back(100); imwrite(outfile, lim, compression_params); if(lim.cols != 480 || lim.rows != 320) cerr << "size error" << endl; return 0; }
程序分三大步骤完成:读如程序选项中的输入图像;对输入图像去除最后一行和最后一列,判断高度和宽度的要求(是否进行反转90度);将图像写入磁盘。
写入磁盘时,使用了jpeg压缩方式,压缩的参数设置为100,表示无失真压缩。
输入图像的名称和输出图像的名称使用同一个。
bash处理
用bash对某个目录下的所有图像都处理一次,并且输出到指定的目录。源代码如下:
SPS="input/" DFS=`ls -A ${SPS}*.jpg` JPGDIR="../output/jpg" mkdir -p ${JPGDIR} for fn in $DFS do echo $fn ./rmRowACols.exe $fn $JPGDIR done
总结
BASH+C/C++ 合作来完成一个完整的任务,各取所长,兼顾性能和开发难度,目前被我认为是比较简单的方式。
这样作还有一个好处:C\C++语言可以做更多细节,别调用别人的程序要随意一点。
使用OpenCV读、操作、写图像并与bash合作对某个目录下所有图像进行类似处理的更多相关文章
- 使用OpenCV读、操作、写图像并与bash合作对某个文件夹下全部图像进行相似处理
我门要对某个文件夹下全部图像文件进行统一处理,假设图像的数量过多.那么手动地一张张处理就会显得有些麻烦.本文使用OpenCV和bash来完毕我们指定的任务. 任务 将文件夹A下的全部统一格式的jpg图 ...
- Python调用OpenCV读显写
OpenCV提供了python的接口,而且很重要的一点是python下的很多接口名与C++的接口名是一样的,这一篇先记录python调用OpenCV去读取图像.显示图像和保存图像. 1.OpenCV读 ...
- Java IO流操作(III)——File类&案例一:输出制定目录下所有java文件名(包含子目录)&案例二:删除指定的目录(包含子目录)
1. File常用的构造 File file = new File("字符串路径"); File f = new File("D:\\a\\b.txt"); F ...
- 如何在安卓/data(而不是/data/data)目录下进行文件的读写操作
分析:Android默认是无法直接操作/data目录的,只能读写程序自己的私有目录,也就是/data/data/package name/下,默认只能操作这个目录下的文件,也就是我们想直接读写/dat ...
- HDFS的工作原理(读和写操作)
工作原理: NameNode和DateNode,NameNode相当于一个管理者,它管理集群内的DataNode,当客户发送请求过来后,NameNode会 根据情况指定存储到哪些DataNode上,而 ...
- [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)
温馨提示 建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容. ...
- CI中获取读操作的结果集行数+获取写操作的影响行数
本质:读操作,用mysql_num_rows函数,写操作用mysql_affected_rows函数 mysql_num_rows() 返回结果集中行的数目.此命令仅对 SELECT 语句有效.要取得 ...
- Python open()函数文件打开、读、写操作详解
一.Python open()函数文件打开操作 打开文件会用到open函数,标准的python打开文件语法如下:open(name[,mode[,buffering]])open函数的文件名是必须的, ...
- (MariaDB/MySQL)MyISAM存储引擎读、写操作的优先级
MariaDB/MySQL中使用表级锁的存储引擎(例如MyISAM.Aria(MariaDB对MyISAM引擎的改进,前身是MyISAM))在读(select).写操作(insert.delete.u ...
随机推荐
- [LeetCode] Degree of an Array 数组的度
Given a non-empty array of non-negative integers nums, the degree of this array is defined as the ma ...
- 解决:GitHub 远程端添加了 README.md 文件后,本地 push 代码时出现错误
一.错误描述 To github.com:compassblog/PythonExercise.git ! [rejected] master -> master (fetch first) e ...
- SpringMVC 自定义类型转换器
先准备一个JavaBean(Employee) 一个Handler(SpringMVCTest) 一个converters(EmployeeConverter) 要实现的输入一个字符串转换成一个emp ...
- js高阶函数应用—函数柯里化和反柯里化
在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...
- [HNOI 2014]画框
Description 题库链接 \(T\) 组询问,每组询问给你个 \(2\times N\) 的带权二分图,两个权值 \(a,b\) ,让你做匹配使得 \[\sum a\times \sum b\ ...
- [SDOI2009]HH去散步
题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...
- 【bzoj4009 hnoi2015】接水果
题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更加难的版本. 首先有 ...
- [Codeforces]871D Paths
失踪OJ回归. 毕竟这样的数论没做过几道,碰上一些具体的应用还是无所适从啊.小C还是借助这题大致摸索一下莫比乌斯函数吧. Description 有n个点,标号为1~n,为这n个点建一张无向图.两个点 ...
- [bzoj4824][Cqoi2017]老C的键盘
来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...
- [Apio2009][bzoj1179]Atm
题意:一个n个点m条单向边的图,每个点有权值,给定出发点和p个可以停止的点,你可以随便走一条路径从出发点走到一个可以停止的点,但是每个点的点权只能计算一次,求能得到的最大权值. n,m<=500 ...