图片文件格式的转换其实很简单,应为所有转换格式的算法都包在cvLoadImage(),cvSaveImage()里啦,对OpenCV而言,可以不用去知道如何去实例它的图像文件格式而做到直接打开的功能,而他读到的文件甚至连它的相关信息全都包在IplImage数据结构里,以下是简单的转档程序实例
图像文件格式的转换
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
-
- int main()
- {
- IplImage *Image1;
- char FileName[10],ConvertFormatAndName[10];
-
- printf("文件名称\n>");
- scanf("%s",&FileName);
- printf("转档名称(jpg,bmp,tif,png,ppm,)\n>");
- scanf("%s",&ConvertFormatAndName);
-
- if((Image1=cvLoadImage(FileName,-1))!=0)
- {
- cvSaveImage(ConvertFormatAndName,Image1);
- }
- }
执行结果:
(1)ghyll.jpg转档前
(2)执行转档程序
(3)转档后
非 常的简单又简短吧!实际上也只用到cvLoadImage()跟cvSaveImage()的存盘读档的动作,比较复杂的一层已经被包在 cvLoadImage()跟cvSaveImage()的子程序里面了,当然,只用到单纯文件转换根本不够看,因为有很多应用软件都可以做到文件转换的 功能,但假使,今天有好几千张的jpg图像文件要转换成bmp图像文件,光是用软件慢慢一张张打开转换就会累个半死,而有了这些source code就可以做更多更强大的应用.
将目录下的所有图像文件做转换
- #include <stdio.h>
- #include <stdlib.h>
- #include <cv.h>
- #include <highgui.h>
- #include <string.h>
- #include <dirent.h>
-
- DIR *DIR1;
- struct dirent *Entry1;
- char *StrPointer;
- char picFormat[4];
-
- IplImage *Image1;
- int main()
- {
- printf("====转档程序====\n");
- printf("这是将跟可执行文件同目录底下的所有图片包含\nbmp,dib\njpg,jpge,jpe,jp2\n");
- printf("exr\npng\ntif,tiff\npbm,pgm,ppm\nras,sr\n扩展名转成目标文件格式的程序\n");
- printf("\n\n请输入要转档扩展名名称\n");
- printf("(bmp,dib,jpg,jpge,jpe,jp2,exr,png,tif,tiff,pbm,pgm,ppm,ras,sr)\n\n> ");
- scanf(" %s",&picFormat);
-
- DIR1=opendir(".");
- while(Entry1=readdir(DIR1))
- {
-
- if((StrPointer=strstr(Entry1->d_name,".bmp"))||
- (StrPointer=strstr(Entry1->d_name,".dib"))||
- (StrPointer=strstr(Entry1->d_name,".jpg"))||
- (StrPointer=strstr(Entry1->d_name,".jpge"))||
- (StrPointer=strstr(Entry1->d_name,".jpe"))||
- (StrPointer=strstr(Entry1->d_name,".jp2"))||
- (StrPointer=strstr(Entry1->d_name,".exr"))||
- (StrPointer=strstr(Entry1->d_name,".png"))||
- (StrPointer=strstr(Entry1->d_name,".tif"))||
- (StrPointer=strstr(Entry1->d_name,".tiff"))||
- (StrPointer=strstr(Entry1->d_name,".pbm"))||
- (StrPointer=strstr(Entry1->d_name,".pgm"))||
- (StrPointer=strstr(Entry1->d_name,".ppm"))||
- (StrPointer=strstr(Entry1->d_name,".ras"))||
- (StrPointer=strstr(Entry1->d_name,".sr")))
- {
-
- Image1=cvLoadImage(Entry1->d_name,-1);
-
- strncpy(StrPointer+1,picFormat,3);
-
- cvSaveImage(Entry1->d_name,Image1);
-
- printf("%s\n",Entry1->d_name);
- }
-
- }
-
- system("pause");
- }
执行结果:
(1)转档前
(2)选定扩展名
(3)执行列表
(4)转档后
这是将所有目录底下的图片,全部的图像文件格式转成目标想要的图像文件,数量很大的时候跑程序会方便又省时,或是遇到一堆图像文件都开不起来的时候,也可以用这种方法将之转换.
程 序一开始用了"dirent.h"的函数库,以及他函数库底下DIR跟dirent(directory entry)数据结构,接着就是打开dir目录的列表,这边用"."代表的是可执行文件下的目录位置,也就是相对位置,也可以用"c:\\xxx\"等路 径,也就是目录底下的绝对位置,这边打开的结果会放在DIR数据结构内,再用readdir()检视列表,将readdir()的结果放在dirent的 数据结构内,有写过数据库相关程序设计的话,用法其实很相似的.它会逐次将目录下的东西列出来,这边撷取扩展名为跟图像相关的文件 (bmp,jpg,png...)来做存取的动作,再用前面的scanf()输入的扩展名名称来做转档.
cvLoadImage()
被放在"highgui.h"里,可以读取不同图像文件格式,也可以藉由参数去转全彩或灰级.
IplImage* cvLoadImage("读取图像文件名称",参数);
cvSaveImage()
被放在"highgui.h"里,可以存储成不同图像文件格式.
cvSaveImage("存储图像文件名称",IplImage数据结构);
(fzzl) |