使用访问图像三种办法,指针,迭代器,动态地址计算
指针访问
方法一
# include <opencv2/opencv.hpp>
# include <iostream>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/imgproc/imgproc.hpp> using namespace std;
using namespace cv;
# include <iostream>
# include <fstream>
using namespace cv;
# include <opencv2/core/core.hpp> # include <opencv2/opencv.hpp>
void colorReduce ( Mat& inputImage, Mat& outputImage, int div) ;
int main ( )
{ Mat srcImage = imread ( "1.jpg" ) ; imshow ( "原始图像" , srcImage) ; Mat dstImage; dstImage. create ( srcImage. rows, srcImage. cols, srcImage. type ( ) ) ; double time0 = static_cast < double > ( getTickCount ( ) ) ; colorReduce ( srcImage, dstImage, 32 ) ; time0 = ( ( double ) getTickCount ( ) - time0) / getTickFrequency ( ) ; cout << "此方法运行时间为: " << time0 << "秒" << endl; imshow ( "效果图" , dstImage) ; waitKey ( 0 ) ;
}
void colorReduce ( Mat& inputImage, Mat& outputImage, int div)
{ outputImage = inputImage. clone ( ) ; int rowNumber = outputImage. rows; int colNumber = outputImage. cols * outputImage. channels ( ) ; for ( int i = 0 ; i < rowNumber; i++ ) { uchar* data = outputImage. ptr < uchar> ( i) ; for ( int j = 0 ; j < colNumber; j++ ) { data[ j] = data[ j] / div * div + div / 2 ; } }
}
指针访问方法二
# include <opencv2/opencv.hpp> int main ( ) { cv:: Mat image = cv:: imread ( "path/to/your/image.jpg" ) ; if ( image. empty ( ) ) { std:: cerr << "Error: Could not read the image." << std:: endl; return - 1 ; } int rows = image. rows; int cols = image. cols; for ( int i = 0 ; i < rows; ++ i) { for ( int j = 0 ; j < cols; ++ j) { cv:: Vec3b& pixel = image. at < cv:: Vec3b> ( i, j) ; pixel[ 0 ] = 0 ; pixel[ 1 ] = pixel[ 1 ] ; pixel[ 2 ] = pixel[ 2 ] ; } } cv:: imshow ( "Modified Image" , image) ; cv:: waitKey ( 0 ) ; return 0 ;
}
使用迭代器调用图片
# include <opencv2/opencv.hpp>
# include <iostream>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/imgproc/imgproc.hpp> using namespace std;
using namespace cv;
# include <iostream>
# include <fstream>
using namespace cv;
# include <opencv2/core/core.hpp> # include <opencv2/opencv.hpp>
void colorReduce ( Mat& inputImage, Mat& outputImage, int div) ;
int main ( )
{ Mat srcImage = imread ( "1.jpg" ) ; imshow ( "原始图像" , srcImage) ; Mat dstImage; dstImage. create ( srcImage. rows, srcImage. cols, srcImage. type ( ) ) ; double time0 = static_cast < double > ( getTickCount ( ) ) ; colorReduce ( srcImage, dstImage, 32 ) ; time0 = ( ( double ) getTickCount ( ) - time0) / getTickFrequency ( ) ; cout << "此方法运行时间为: " << time0 << "秒" << endl; imshow ( "效果图" , dstImage) ; waitKey ( 0 ) ;
} void colorReduce ( Mat& inputImage, Mat & outputImage, int div)
{
outputImage = inputImage. clone ( ) ;
Mat_< Vec3b> :: iterator it = outputImage. begin < Vec3b> ( ) ;
Mat_< Vec3b> :: iterator itend = outputImage. end < Vec3b> ( ) ;
for ( ; it != itend; ++ it)
{
( * it) [ 0 ] = ( * it) [ 0 ] / div* div + div/ 2 ;
( * it) [ 1 ] = ( * it) [ 1 ] / div* div + div/ 2 ;
( * it) [ 2 ] = ( * it) [ 2 ] / div* div + div/ 2 ;
}
}
方法二使用迭代器调用图片
# include <opencv2/opencv.hpp> int main ( ) { cv:: Mat image = cv:: imread ( "1.jpg" ) ; if ( image. empty ( ) ) { std:: cerr << "Error: Could not read the image." << std:: endl; return - 1 ; } for ( cv:: MatIterator_< cv:: Vec3b> it = image. begin < cv:: Vec3b> ( ) ; it != image. end < cv:: Vec3b> ( ) ; ++ it) { cv:: Vec3b& pixel = ( * it) ; pixel[ 0 ] = 0 ; pixel[ 1 ] = pixel[ 1 ] ; pixel[ 2 ] = pixel[ 2 ] ; } cv:: imshow ( "Modified Image" , image) ; cv:: waitKey ( 0 ) ; return 0 ;
}
使用动态地址调用图片
# include <opencv2/opencv.hpp>
# include <iostream>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/imgproc/imgproc.hpp> using namespace std;
using namespace cv;
# include <iostream>
# include <fstream>
using namespace cv;
# include <opencv2/core/core.hpp> # include <opencv2/opencv.hpp>
void colorReduce ( Mat& inputImage, Mat& outputImage, int div) ;
int main ( )
{ Mat srcImage = imread ( "1.jpg" ) ; imshow ( "原始图像" , srcImage) ; Mat dstImage; dstImage. create ( srcImage. rows, srcImage. cols, srcImage. type ( ) ) ; double time0 = static_cast < double > ( getTickCount ( ) ) ; colorReduce ( srcImage, dstImage, 32 ) ; time0 = ( ( double ) getTickCount ( ) - time0) / getTickFrequency ( ) ; cout << "此方法运行时间为: " << time0 << "秒" << endl; imshow ( "效果图" , dstImage) ; waitKey ( 0 ) ;
}
void colorReduce ( Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage. clone ( ) ; int rowNumber = outputImage. rows; int colNumber = outputImage. cols; for ( int i = 0 ; i < rowNumber; i++ ) { for ( int j = 0 ; j < colNumber; j++ ) { outputImage. at < Vec3b> ( i, j) [ 0 ] = outputImage. at < Vec3b> ( i, j) [ 0 ] / div * div + div / 2 ; outputImage. at < Vec3b> ( i, j) [ 1 ] = outputImage. at < Vec3b> ( i, j) [ 1 ] / div * div + div / 2 ; outputImage. at < Vec3b> ( i, j) [ 2 ] = outputImage. at < Vec3b> ( i, j) [ 2 ] / div * div + div / 2 ; } }
}
方法二动态地址计算
# include <opencv2/opencv.hpp> int main ( ) { cv:: Mat image = cv:: imread ( "1.jpg" ) ; if ( image. empty ( ) ) { std:: cerr << "Error: Could not read the image." << std:: endl; return - 1 ; } int rows = image. rows; int cols = image. cols; for ( int i = 0 ; i < rows; ++ i) { uchar* rowPtr = image. ptr < uchar> ( i) ; for ( int j = 0 ; j < cols; ++ j) { int offset = j * image. channels ( ) ; rowPtr[ offset] = 0 ; rowPtr[ offset + 1 ] = rowPtr[ offset + 1 ] ; rowPtr[ offset + 2 ] = rowPtr[ offset + 2 ] ; } } cv:: imshow ( "Modified Image" , image) ; cv:: waitKey ( 0 ) ; return 0 ;
}