作者:小女人的忧伤-- | 来源:互联网 | 2023-10-10 15:38
本次对像素的操作一共使用了五种方法,并进行计时对比,最终Opencv中的Copy方式速度是最快的,次之是指针遍历方式。
#include "opencv2\opencv.hpp"
#include
using namespace std;
using namespace cv;
bool copyByArrayWay(Mat srcImg, Mat &resultImg);//数组at遍历方式
bool copyByRowPtrWay(Mat srcImg, Mat &resultImg);//行指针遍历方式
bool copyByPtrWay(Mat srcImg, Mat &resultImg);//指针遍历方式
bool copyByIteratorWay(Mat srcImg, Mat &resultImg);//迭代方式
bool copyByOpenCv(Mat srcImg, Mat &resultImg);//OpenCv copy方式
int main(int argv, char** argc)
{
Mat src = imread("G:\\CVworkstudy\\program_wwx\\研习社140课时\\ZhaiZhigang140\\lena.jpg");
if (src.empty())
{
printf("Could not load image...\n");
return -1;
}
int64 startTime, endTime;
double usedTime;
////数组遍历方式
Mat arrayWayResult = Mat::zeros(src.size(), src.type());
startTime = getTickCount();
copyByArrayWay(src, arrayWayResult);
endTime = getTickCount();
usedTime = (endTime - startTime) / getTickFrequency() * 1000;
cout <<"数组遍历方式耗时:" <"毫秒" << endl;
imshow("arrayWay", arrayWayResult);
////行指针遍历方式
Mat rowPtrWayResult = Mat::zeros(src.size(), src.type());
startTime = getTickCount();
copyByRowPtrWay(src, rowPtrWayResult);
endTime = getTickCount();
usedTime = (endTime - startTime) / getTickFrequency() * 1000;
cout <<"行指针遍历方式耗时:" <"毫秒" << endl;
imshow("rowPtrWay", rowPtrWayResult);
////指针方式遍历
Mat ptrWayResult = Mat::zeros(src.size(), src.type());
startTime = getTickCount();
copyByPtrWay(src, ptrWayResult);
endTime = getTickCount();
usedTime = (endTime - startTime) / getTickFrequency() * 1000;
cout <<"指针遍历方式耗时:" <"毫秒" << endl;
imshow("ptrWay", ptrWayResult);
////迭代方式遍历
Mat iterWayResult = Mat::zeros(src.size(), src.type());
startTime = getTickCount();
copyByIteratorWay(src, iterWayResult);
endTime = getTickCount();
usedTime = (endTime - startTime) / getTickFrequency() * 1000;
cout <<"迭代方式耗时:" <"毫秒" << endl;
imshow("iterWay", iterWayResult);
////OpenCv copy方式
Mat copyWayResult = Mat::zeros(src.size(), src.type());
startTime = getTickCount();
copyByOpenCv(src, copyWayResult);
endTime = getTickCount();
usedTime = (endTime - startTime) / getTickFrequency() * 1000;
cout <<"Opencv copy方式耗时:" <"毫秒" << endl;
imshow("OpencvCopyWay", copyWayResult);
waitKey(0);
return 0;
}
//数组遍历方式 at
bool copyByArrayWay(Mat srcImg,Mat &resultImg)
{
if (srcImg.empty())
{
printf("Could not load image...\n");
return false;
}
int rows = srcImg.rows;
int cols = srcImg.cols;
int ch = srcImg.channels();
for (int row = 0; row ) {
for (int col = 0; col ) {
if (ch == 3) {
resultImg.at(row, col) = srcImg.at(row,col);
}
else if (ch == 1) {
resultImg.at(row, col) = srcImg.at(row, col);
}
}
}
return true;
}
//行指针遍历方式
bool copyByRowPtrWay(Mat srcImg, Mat &resultImg)
{
if (srcImg.empty())
{
printf("Could not load image...\n");
return false;
}
int rows = srcImg.rows;
int rowPixelNums = (srcImg.cols) * (srcImg.channels());
for (int row = 0; row ) {
uchar *srcRowPtr = srcImg.ptr(row);
uchar *resultRowPtr = resultImg.ptr(row);
for (int pixelNum = 0; pixelNum ) {
resultRowPtr[pixelNum] = srcRowPtr[pixelNum];
}
}
return true;
}
//指针遍历方式
bool copyByPtrWay(Mat srcImg, Mat &resultImg)
{
if (srcImg.empty()) {
printf("Could not load image...\n");
return false;
}
int ch = srcImg.channels();
int totalPixelNums = (srcImg.rows) * (srcImg.cols) * ch;
uchar *srcRowPtr = srcImg.ptr(0);
uchar *resultRowPtr = resultImg.ptr(0);
for (int pixel = 0; pixel ) {
resultRowPtr[pixel] = srcRowPtr[pixel];
}
return true;
}
//迭代方式
bool copyByIteratorWay(Mat srcImg, Mat &resultImg)
{
if (srcImg.empty()) {
printf("Could not load image...\n");
return false;
}
int ch = srcImg.channels();
if (ch == 3) {
Mat_::iterator srcPtrBegin = srcImg.begin();
Mat_::iterator outPtrBegin = resultImg.begin();
Mat_::iterator srcPtrEnd = srcImg.end();
while (srcPtrBegin != srcPtrEnd) {
*outPtrBegin = *srcPtrBegin;
srcPtrBegin++;
outPtrBegin++;
}
return true;
}
else if (ch == 1) {
Mat_::iterator srcPtrBegin = srcImg.begin();
Mat_::iterator outPtrBegin = resultImg.begin();
Mat_::iterator srcPtrEnd = srcImg.end();
while (srcPtrBegin != srcPtrEnd) {
*outPtrBegin = *srcPtrBegin;
srcPtrBegin++;
outPtrBegin++;
}
return true;
}
else
return false;
}
//OpenCv copy方式
bool copyByOpenCv(Mat srcImg, Mat &resultImg)
{
if (srcImg.empty()) {
printf("Could not load image...\n");
return false;
}
srcImg.copyTo(resultImg);
return true;
}