opencv学习

来源:互联网 发布:如何查询行业数据 编辑:程序博客网 时间:2024/05/17 07:30

(1)利用数组来构建cv::Mat

   示例代码如下所示:

[cpp] view plaincopy
  1. void ArrayToMat()  
  2. {  
  3.     double m[3][3];  
  4.     for (int i=0; i<3; i++)  
  5.     {  
  6.         for (int j=0; j<3; j++)  
  7.         {  
  8.             m[i][j] = i+j;  
  9.             cout<<m[i][j]<<" ";  
  10.         }  
  11.         cout<<endl;  
  12.     }  
  13.     cout<<"****************************************"<<endl;  
  14.   
  15.     Mat M = Mat(3, 3, CV_64F, m);  
  16.     double tempVal = 0.0;  
  17.   
  18.     for (int i=0; i<3; i++)  
  19.     {  
  20.         for (int j=0; j<3; j++)  
  21.         {  
  22.             tempVal = M.at<double>(i,j);  
  23.             cout<<tempVal<<" ";  
  24.         }  
  25.         cout<<endl;  
  26.     }  
  27. }  

不出意外的话,执行结果应该如下所示:


(2) IplImage*cv::Mat之间的互相转换

示例代码:

[cpp] view plaincopy
  1. void IplImageToMat()  
  2. {  
  3.     IplImage* pImg = cvLoadImage("c:/test.jpg");  
  4.     if (!pImg)  
  5.     {  
  6.         cout<<"pImg load error"<<endl;  
  7.         system("pause");  
  8.         exit(-1);  
  9.     }  
  10.   
  11.     cvNamedWindow("pImg", 0);  
  12.     cvNamedWindow("mtx", 0);  
  13.       
  14.     Mat mtx(pImg);   
  15.       
  16.     cvShowImage("pImg", pImg);  
  17.     imshow("mtx", mtx);  
  18.     cvWaitKey(0);  
  19.   
  20.     cvReleaseImage(&pImg);  
  21. }  

笔者任意加载了电脑上一副图片,结果如下所示:


提醒,这里的格式转换并不申请新的内存,而仅仅是改变数据结构而已

(3)Mat转换为IplImge

示例代码:

[cpp] view plaincopy
  1. void MatToIplImage()  
  2. {  
  3.     Mat m = imread("c:/test.jpg");  
  4.     if (m.empty())  
  5.     {  
  6.         cout<<"mat load error"<<endl;  
  7.         system("pause");  
  8.         exit(-1);  
  9.     }  
  10.   
  11.     IplImage img1 = IplImage(m);  
  12.     IplImage img2 = m;  
  13.   
  14.     cvNamedWindow("img1", 0);  
  15.     cvNamedWindow("img2", 0);  
  16.   
  17.     cvShowImage("img1", &img1);  
  18.     cvShowImage("img2", &img2);  
  19.   
  20.     cvWaitKey(0);  
  21. }  

笔者任意加载一张图片,上述代码的执行结果为:


(4)访问二维数据(cv::Mat)最高效的方式是先得到该二维数据的每一行的指针,然后利用下标运算符逐列访问

示例代码:

[cpp] view plaincopy
  1. void MatAccess()  
  2. {  
  3.     double m[3][3];  
  4.     for (int i=0; i<3; i++)  
  5.     {  
  6.         for (int j=0; j<3; j++)  
  7.         {  
  8.             m[i][j] = i+j;  
  9.             cout<<m[i][j]<<" ";  
  10.         }  
  11.         cout<<endl;  
  12.     }  
  13.     cout<<"****************************************"<<endl;  
  14.   
  15.     Mat M = Mat(3, 3, CV_64F, m);  
  16.     double sum = 0;  
  17.     int rows = M.rows;  
  18.     int cols = M.cols;  
  19.   
  20.     for (int i=0; i<rows; i++)  
  21.     {  
  22.         const double* Mi = M.ptr<double>(i);  
  23.         for (int j=0; j<cols; j++)  
  24.         {  
  25.             sum += Mi[j];  
  26.         }  
  27.     }  
  28.     cout<<"sum: "<<sum<<endl;  
  29. }  

上面的代码执行结果为:


(5)cv::Mat支持STL中的迭代器功能

示例代码:

[cpp] view plaincopy
  1. void MatAccess()  
  2. {  
  3.     double m[3][3];  
  4.     for (int i=0; i<3; i++)  
  5.     {  
  6.         for (int j=0; j<3; j++)  
  7.         {  
  8.             m[i][j] = i+j;  
  9.             cout<<m[i][j]<<" ";  
  10.         }  
  11.         cout<<endl;  
  12.     }  
  13.     cout<<"****************************************"<<endl;  
  14.   
  15.     Mat M = Mat(3, 3, CV_64F, m);  
  16.     double sum = 0;  
  17.     int rows = M.rows;  
  18.     int cols = M.cols;  
  19.   
  20.     for (int i=0; i<rows; i++)  
  21.     {  
  22.         const double* Mi = M.ptr<double>(i);  
  23.         for (int j=0; j<cols; j++)  
  24.         {  
  25.             sum += Mi[j];  
  26.         }  
  27.     }  
  28.     cout<<"sum: "<<sum<<endl;  
  29.   
  30.     sum = 0;  
  31.     MatConstIterator_<double> it = M.begin<double>();  
  32.     MatConstIterator_<double> itEnd = M.end<double>();  
  33.     for (;it!=itEnd; it++)  
  34.     {  
  35.         sum += *it;  
  36.     }  
  37.     cout<<"sum: "<<sum<<endl;  
  38. }  

运行结果:


(6) satureat_cast : openCV中用于数据“饱和”判断

示例:

[cpp] view plaincopy
  1. void Saturate_castTest()  
  2. {  
  3.     int r = 300;  
  4.     uchar t = saturate_cast<uchar>(r);  
  5.     cout<<int(t)<<endl;  
  6. }  

结果:


(7)获取函数执行时间

getTickCount()和getTickFrequency()结合起来可以用来计算函数执行时间,尤其是很小的代码片段的执行时间

举例:

[cpp] view plaincopy
  1. void GetFuncTime()  
  2. {  
  3.     double exec_time = (double)getTickCount();  
  4.     for (int i=0; i<10; i++)  
  5.     {  
  6.         ;  
  7.     }  
  8.     exec_time = ((double)getTickCount() - exec_time)*1000./getTickFrequency();  
  9.     cout<<exec_time<<endl;  
  10. }  

上面的代码,重点在于for循环,且,该循环中什么也不处理;用一般的时间函数很难计算出该代码片段的执行时间,但利用getTickCount()和getTickFrequency()就很容易。笔者电脑上的结果是:


0 0
原创粉丝点击