opencv 访问每个像素点

来源:互联网 发布:js执行exe文件 编辑:程序博客网 时间:2024/05/16 00:32
  1. /http://blog.csdn.net/moc062066  
  2. //20111128  
  3. #include "opencv2/opencv.hpp"  
  4. #include <iostream>  
  5.   
  6. using namespace std;  
  7. using namespace cv;  
  8.    
  9. int main(int argc,char** argv)  
  10. {  
  11.   
  12.     const char* filename = "google.png";  
  13.       
  14.     //CV_8UC3  
  15.     //相应的CV_8SC3---Vec3s  
  16.     //相应的CV_16UC3---Vec3w  
  17.     Mat mat_CV_8UC3 = imread(filename,IMREAD_COLOR);  
  18.    forsize_t nrow = 0; nrow < mat_CV_8UC3.rows; nrow++)  
  19.     {  
  20.        for(size_t ncol = 0; ncol < mat_CV_8UC3.cols; ncol++)  
  21.        {  
  22.            Vec3i bgr = mat_CV_8UC3.at<Vec3b>(nrow,ncol);//用Vec3b也行  
  23.            cout   << "("<<bgr.val[0]<<","  
  24.                    <<bgr.val[1]<<","  
  25.                    <<bgr.val[2]<<")";  
  26.        }  
  27.        cout << endl;  
  28.     }  
  29.       
  30.     forsize_t nrow = 0; nrow < mat_CV_8UC3.rows; nrow++)  
  31.     {  
  32.         uchar* data = mat_CV_8UC3.ptr<uchar>(nrow);  
  33.        for(size_t ncol = 0; ncol < mat_CV_8UC3.cols * mat_CV_8UC3.channels(); ncol++)  
  34.        {  
  35.             cout << int( data[ncol] ) ;  
  36.        }  
  37.        cout << endl;  
  38.     }  
  39.   
  40.    //------CV_8UC1----------start---  
  41.    //  
  42.     Mat mat_CV_8UC1 = imread(filename,IMREAD_GRAYSCALE);  
  43.    forsize_t nrow = 0; nrow < mat_CV_8UC1.rows; nrow++)  
  44.    {  
  45.        for(size_t ncol = 0; ncol < mat_CV_8UC1.cols; ncol++)  
  46.        {  
  47.            uchar val = mat_CV_8UC1.at<uchar>(nrow,ncol);  
  48.            //  
  49.            cout << (int(val) > 200 ? 1 :0) ;//cout<<int(val)<< endl ;  
  50.        }  
  51.        cout << endl ;  
  52.    }  
  53.    cout << endl;  
  54.   
  55.     for ( size_t row = 0 ; row < mat_CV_8UC1.rows ; ++row)   
  56.     {  
  57.         uchar* ptr = mat_CV_8UC1.ptr<uchar>(row);  
  58.         for ( size_t col = 0 ; col < mat_CV_8UC1.cols ; ++col)   
  59.         {  
  60.             cout << ( int(ptr[col]) > 200 ? 1 :0) ;//cout<<int(val)<< endl ;  
  61.         }  
  62.         cout << "\n" ;  
  63.     }  
  64.     cout << endl;  
  65.       
  66.    MatIterator_<uchar> it = mat_CV_8UC1.begin<uchar>(), it_end = mat_CV_8UC1.end<uchar>();  
  67.    for(int cnt = 1; it != it_end; ++it)  
  68.     {  
  69.         cout << ( int(*it) > 200 ? 1 : 0) ;  
  70.         if( (cnt++ % mat_CV_8UC1.cols) ==0 )  
  71.             cout << endl;       
  72.     }  
  73.    //------CV_8UC1----------end---     
  74.   
  75.       
  76.   return 0;  
  77. }  


#include <windows.h>
#include<iostream>  
_LARGE_INTEGER  timer_start;
_LARGE_INTEGER timer_end;
_LARGE_INTEGER f;
QueryPerformanceFrequency(&f);
QueryPerformanceCounter(&timer_start);
for(int y = 0; y < g_srcImage.rows; y++ )  
{  
for(int x = 0; x < g_srcImage.cols; x++ )  
{  
for(int c = 0; c < 3; c++ )  
{  
g_dstImage.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue );  
}  
}  
}  
QueryPerformanceCounter(&timer_end);
double  timepro=(timer_end.QuadPart-timer_start.QuadPart)/(double)f.QuadPart;
cout<<"at<Vec3b> :"<<timepro<<endl;
QueryPerformanceCounter(&timer_start);
for(int x = 0; x < g_srcImage.rows; x++ )  
{  
uchar *prowFirist=g_srcImage.ptr<uchar>(x);
uchar *pDstrowFirist=g_dstImage.ptr<uchar>(x);
for (int y=0;y<g_srcImage.cols*3;y++)
{
pDstrowFirist[y]=saturate_cast<uchar>( (g_nContrastValue*0.01)*(g_srcImage.ptr<uchar>(x)[y]) + g_nBrightValue );  
}  
}
QueryPerformanceCounter(&timer_end);
timepro=(timer_end.QuadPart-timer_start.QuadPart)/(double)f.QuadPart;
cout<<"[] :"<<timepro<<endl;

通过上面的计时 发现数据直接访问比用at函数要快上不少。 在所有的访问方式中 用指针访问的方式是最快的。
1 0
原创粉丝点击