VS模板中默认带两个参数 int argc,char** argv 以往的程序开发中,总把这两个参数当成了摆设。今天在读learning OpenCv 发现里面很多的代码都在使用这两个参数。尤其和cvLoadImage相结合时argv 参数的作用很多。
其中常见的一种读入图像数据的方式是:
IplImage* Img=cvLoadImage(argv[1],0);
至于怎么样给argv[1]赋值 我查阅了一些资料,现给出几种方法
首先说明 argv[0]代表了编译生成的可执行文件.exe;因而一般是保留参数。第一种方式可能和argv关联不大,具体说来就是在程序首部先定义一个FileName的变量,然后在程序体内用cvLoadImage调用,而FileName有相对名称和绝对路径两种调用方式,大家可以看这段程序:
# include"highgui.h"
char FileName[]="nexus.jpg";
int main( int argc,char** argv){
IplImage* img=cvLoadImage(FileName);
cvNamedWindow("Load Img Example",CV_WINDOW_AUTOSIZE);
cvShowImage("Load Img Example",img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Load Img Example");
}
上述这段程序的使用有个前提,就是保证在工程目录下(注意到不是debug也不是release子目录)存在"nexus.jpg"这样一个图像数据文件。
或者采用一个绝对路径 会更保险一些:
char FileName[]="D:\\ImgSrc\\nexus.jpg";
但是每次都要这么定义 的确麻烦了一点。argv 的作用就凸显出来了。可以在属性管理器中选择debug或者release版本的工程,右键点击属性命令.
在属性对话框中选择命令参数
如果程序只有一个参数argv[1] 可供调用 那么命令参数的值设置为nexus.jpg 所在的路径
如果程序调用的argv有多个的话,一个可行的方案是在命令参数内将对应的参数值按照定义的顺序列出 参数之间以空格隔开
比如如下的程序 在图片上找到一个ROI(Region Of Interest)然后给这个ROI 内的像素值都进行add 150的操作,
//roi_add <image> <x> <y> <width> <height> <add>
#include<cv.h>
#include<highgui.h>
int main(int argc,char** argv)
{
IplImage* src;
if(argc==7 && ((src=cvLoadImage(argv[1],1)) !=0))
{
int x=atoi(argv[2]);
int y=atoi(argv[3]);
int width=atoi(argv[4]);
int height=atoi(argv[5]);
int add=atoi(argv[6]);
cvSetImageROI(src,cvRect(x,y,width,height));
cvAddS(src,cvScalar(add),src);
cvResetImageROI(src);
cvNamedWindow("Roi_Add",1);
cvShowImage("Roi_Add",src);
cvWaitKey();
}
return 0;
}
这里使用了6个参数 argv[1]-argv[6] 故在对应的命令参数值里面我们需要依次填入6个值
C:\CV_Code\ImgSrc\nexus.jpg 300 65 100 100 150
分别代表了图像数据的存放路径,像素的起始横、纵坐标,ROI矩形框的长、宽以及需要Add的像素值