- /http://blog.csdn.net/moc062066
- //20111128
- #include "opencv2/opencv.hpp"
- #include <iostream>
- using namespace std;
- using namespace cv;
- int main(int argc,char** argv)
- {
- const char* filename = "google.png";
- //CV_8UC3
- //相应的CV_8SC3---Vec3s
- //相应的CV_16UC3---Vec3w
- Mat mat_CV_8UC3 = imread(filename,IMREAD_COLOR);
- for( size_t nrow = 0; nrow < mat_CV_8UC3.rows; nrow++)
- {
- for(size_t ncol = 0; ncol < mat_CV_8UC3.cols; ncol++)
- {
- Vec3i bgr = mat_CV_8UC3.at<Vec3b>(nrow,ncol);//用Vec3b也行
- cout << "("<<bgr.val[0]<<","
- <<bgr.val[1]<<","
- <<bgr.val[2]<<")";
- }
- cout << endl;
- }
- for( size_t nrow = 0; nrow < mat_CV_8UC3.rows; nrow++)
- {
- uchar* data = mat_CV_8UC3.ptr<uchar>(nrow);
- for(size_t ncol = 0; ncol < mat_CV_8UC3.cols * mat_CV_8UC3.channels(); ncol++)
- {
- cout << int( data[ncol] ) ;
- }
- cout << endl;
- }
- //------CV_8UC1----------start---
- //
- Mat mat_CV_8UC1 = imread(filename,IMREAD_GRAYSCALE);
- for( size_t nrow = 0; nrow < mat_CV_8UC1.rows; nrow++)
- {
- for(size_t ncol = 0; ncol < mat_CV_8UC1.cols; ncol++)
- {
- uchar val = mat_CV_8UC1.at<uchar>(nrow,ncol);
- //
- cout << (int(val) > 200 ? 1 :0) ;//cout<<int(val)<< endl ;
- }
- cout << endl ;
- }
- cout << endl;
- for ( size_t row = 0 ; row < mat_CV_8UC1.rows ; ++row)
- {
- uchar* ptr = mat_CV_8UC1.ptr<uchar>(row);
- for ( size_t col = 0 ; col < mat_CV_8UC1.cols ; ++col)
- {
- cout << ( int(ptr[col]) > 200 ? 1 :0) ;//cout<<int(val)<< endl ;
- }
- cout << "\n" ;
- }
- cout << endl;
- MatIterator_<uchar> it = mat_CV_8UC1.begin<uchar>(), it_end = mat_CV_8UC1.end<uchar>();
- for(int cnt = 1; it != it_end; ++it)
- {
- cout << ( int(*it) > 200 ? 1 : 0) ;
- if( (cnt++ % mat_CV_8UC1.cols) ==0 )
- cout << endl;
- }
- //------CV_8UC1----------end---
- return 0;
- }
#include <windows.h>
#include<iostream>
#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;
_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函数要快上不少。 在所有的访问方式中 用指针访问的方式是最快的。