关于int main(int argc,char** argv)中argc,argv参数的解释

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提供的指向图像数据开头的指针

猜你喜欢

转载自www.cnblogs.com/cc111/p/9276411.html