1、uchar* previous 和 uchar *previous 两者之间有什么区别?
Answer:在声明一个指针的时候,两者之间没有任何区别,如果同时声明两个指针的时候,就会有区别:
比如 uchar* a , b ; 和 uchar *a , *b ; 这两者之间是不一样的,前一个是错误的声明,后一个才是
正确的变量声明
2、变量前加const
const 用来声明一个常量的,当你不想一个值被改变时,就可以用const进行声明。
3、char和uchar 的区别
char有符号型型变量,全称为signed char,一般缩写为char,范围是-128~127;
uchar在C语言中不存在,会出现语法错误。unsigned char 是无符号型变量范围是 0~255。
4、C++中 :: 的作用意义
1.在类外部声明成员函数:void Point::Area(){};
在这里,Point是指的类名,Area( )是指的类中的成员函数
2.调用全局函数;表示引用成员函数变量及作用域,作用域成员运算符
例:System::Math::Sqrt() 相当于System.Math.Sqrt()。
3.调用类的静态方法: 如:CDisplay::display()。
把域看作是一个可视窗口全局域的对象在它被定义的整个文件里,一直到文件末尾都是可见的。在一个函数内被定义的对象是
局域的(local scope), 它只在定义其的函数体内可见。每个类维持一个域,在这个域之外 ,它的成员是不可见的。类域操
作符告诉编译器后面的标识符可在该类的范围内被找到。
5、关于指针最简单的 “ * ” 和 " & " 的使用
- 首先是定义一个指针: int *p ; 明确一点: 指针其实就是指的指针变量,是一个专门用来存放地址的变量。
- p = &i ; 这句话的意思是: 取i 的地址赋给指针p
上述两种情况综合起来就是: int *p = &i ;
- " * " 是指针运算符, ” & “ 是取地址运算符
- 指向空指针: void* p;
6、关于C++ 中调用OpenCV库函数时,定义图像 Mat时,使用 引号( &) 符号的疑问和解析
**首先需要明确一点是,这个问题一般参考书都会归结到 指针 章节里面的 引用 小节 去讲述**
在图像处理中,经常会看到: Mat& image… 和 Mat &image… 这两种情况
1、引用其实是一种隐式指针
int a = 10 ;
int & ia = a ;
ia = 2; /// 在这里面,定义一个隐式变量ia,它是变量a的别名。
2、使用引用来传递参数。这种方式在OpenCV图像处理中非常常见
比如下面这个例子:
cv::Mat ColorDetector::process(const cv::Mat& image) {
result.create(image.size(), CV_8UC1);
cv::Mat_<cv::Vec3b>::const_iterator it = image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::const_iterator itend = image.end<cv::Vec3b>();
cv::Mat_<uchar>::iterator itout = result.begin<uchar>();
for (; it != itend; it++, itout++) {
if (getColorDistance(*it) <= maxDist) {
*itout = 255;
}
else
*itout = 0;
}
return result;
}
在这里定义一个函数,在函数的参数里面,通过引用,传入 image ( Mat& image ),通过这样的操作;
当我们在主函数中
result = cdetect.process(image);
调用这样的一个函数的时候, 我们传入的是 image 图像,在 process函数里面引用image图像,所以在process里面对图像进行相应的操作,在主函数中的image图像就会随着进行相应的改变。
3、关于 引用符号的位置的说明
Mat&image
Mat[任意个空格]&image
Mat&[任意个空格]image
Mat[任意个空格]&[任意个空格]image
上述四种情况,在编译器看来都是一样的,这些空格在词法分析之后都被忽略了。所以说写法上比较灵活