1.关于int main(int argc,char** argv)中argc,argv参数的解释
argc参数表示命令行中参数的个数,其值是在输入命令时由系统按实际参数的个数自动赋值的
argv参数是字符串指针数组,存放命令行中的参数,长度即为参数个数argc
其中的第0个参数是程序的全名,之后的参数由用户输入的参数确定
2.关于 cv::waitKey(0)的解释:
在inshow之后必须要有waitKey(k),以便给予足够的时间显示图像,功能是不断刷新图像。waitKey(k)仅对窗口机制起作用,其中k的单位为ms:如果k=0,表示无线等待下去,直到有按键按下,无返回值;如果k>0,表示等待的时间,若在这段时间内没有任何操作则等待结束后返回-1,如在期间输入了字符,则最终返回字符的ASCII码
3.像素的表示:
如果是灰度图,用8位整数(unsigned char)表示一个像素,即表示0~255的值.
如果是RGB相机的深度图中,由于记录了各个像素与相机之间的距离(单位为毫米),而RGB相机的量程在十几米左右,超过了255,所以用16位整数(unsigned short)表示一个像素,即表示0~65536的值.
如果是彩色图像,常见的是用三个通道(即red,blue,green三个颜色)表示任意一种色彩,而每个通道占8位,所以用24位表示一个像素.
4.给算法计时:
1).头文件为:#include<ctime>
clock_t time_stt=clock();
在执行相关算法处理之后计算用时: (clock()-time_stt)/(double)CLOCKS_PER_SEC(见p46)
2).头文件为:#include <chrono>
chrono::steady_clock::time_point t1=chrono::steady_clock::now();
在执行相关算法处理之后计算用时time_used:
chrono::steady_clock::time_point t2=chrono::steady_clock::now();
chrono::duration<double> time_used=chrono::duration_cast<chrono::duration<double>>(t2-t1);
5.复制图像的方式:
1.直接赋值:在这种方式下的赋值,一旦对复制后的图像进行更改,则原图像也会改变
2.使用clone函数赋值:对复制后的图像更改不会影响到原图像
6. 遍历图像像素的方法:
1)
1 for(size_t y=0;y<image.rows;++y) 2 { 3 for(size_t x=0;x<image.cols;++x) 4 { 5 //访问位于x,y处的像素 6 //用cv::Mat::ptr获得图像的行指针 7 unsigned char* row_ptr=image.ptr<unsigned char> (y);//row_ptr是第y行的头指针 8 unsigned char* data_ptr=&row_ptr[x*image.channels()];//data_ptr指向待访问的像素数据,why? 9 //输出该像素的每个通道,如果是灰度图就只有一个通道 10 for(int c=0;c!=image.channels();++c) 11 { 12 unsigned char data=data_ptr[c];//data为I(x,y)第c个通道的值 13 } 14 } 15 cout<<endl; 16 } 17 chrono::steady_clock::time_point t2=chrono::steady_clock::now(); 18 chrono::duration<double> time_used=chrono::duration_cast<chrono::duration<double>>(t2-t1); 19 cout<<"遍历图像用时: "<<time_used.count()<<"s."<<endl;
遍历图像用时: 0.0348541s.
2)利用openCV提供的迭代器
1 cv::Mat_<uchar>::iterator it; 2 cv::Mat_<uchar>::iterator itend = image.end<uchar>(); 3 for(it=image.begin<uchar>();it!=itend;++it) 4 { 5 for(int c=0;c!=image.channels();++c) 6 { 7 unsigned char data=*it; 8 } 9 } 10 chrono::steady_clock::time_point t2=chrono::steady_clock::now(); 11 chrono::duration<double> time_used=chrono::duration_cast<chrono::duration<double>>(t2-t1); 12 cout<<"遍历图像用时: "<<time_used.count()<<"s."<<endl;
遍历图像用时: 0.0402411s.
3)利用cv::Mat::data提供的指向图像数据开头的指针