先贴出代码
# include "highgui.h"
# include "cv.h"
# include<iostream>
using namespace std;
using namespace cv;
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;
}
1、main函数的参数传递
(1)argc、argv
argc:代表参数的个数,可以在main函数里面作为判断条件或者不作初始化,传入的参数个数为多少它也为多少;
argv:代表传入的参数;一般情况下是指向字符型指针的指针,原理如下:
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 char *a[] = {"Wel", "To", "China"};
7 char **p = a;
8 for(int i = 0; i < 3; i++)
9 {
10 for (int j = 0; j < strlen(a[i]) + 1; j++)
11 {
12 cout << a[i][j] << "\t" << (void *)&a[i][j] << endl;
13 }
14 cout << endl;
15 }
16
17 for (int i = 0; i < 3; i++)
18 {
19 cout << "a[" << i << "] = " << (void *) a[i] << endl
20 << "&a[" << i << "] = " << &a[i] << endl;
21 }
22
23
24 cout << "p = " << p << endl
25 << "&p = " << &p << endl;
26 return 0;
27 }
运行结果图如下:
我们先看下内存分配图:
由上图可以看出a[0]中存放着'W'的地址,a[1]中存放着'T'的地址,a[2]中存放着'C'的地址,只是这些地址都是指向字符型的,所以直接cout的会输出字符串,而指针p中存放着a[0]的地址,所以*p等于a[0],都是获得'W'的地址,即00A778CCC,而**p和a[0][0]等价都获得了地址00A778CCC中存放的值W。由上图我们可以看到字符地址相隔1个字节,而指针地址相隔4个字节,这样就便于++运算,获得下一个地址了,列如++p后,p就指向a[1],p中存放的是a[1]的地址。
2、如何进行main函数的参数传递
一、第一种方法
(1)按以下步骤,首先点击“属性”
(2)进入“调试”页面
(3)在“命令参数”行中输入需要的参数值,之间用空格隔开
二、第二种方法:通过cmd窗口赋值
运行命令为:
hello.exe Shiqi Yu
那么,argc的值是 3,argv[0]是"hello.exe",argv[1]是"Shiqi",argv[2]是"Yu"。
3、特别地,设置x/y/width/height时,要参考原图的尺寸范围,否则程序将会运行出错。