如何减少以下代码的执行时间
How to reduce the execution time for the following code?
我试图为图像提供一些草图效果,因为我在opencv中使用了高斯建模技术,但我面临一个问题,即执行需要更多时间。当图片大小较小时,时间会减少,如果大小较大,则需要更多时间。请任何人告诉如何在不更改以下代码的图像实际大小的情况下减少执行时间
#include "opencv2/opencv.hpp"
#include <iostream>
#include <vector>
#include "opencv2/ml/ml.hpp"
#include <list>
#include <iostream>
using namespace cv;
using namespace std;
void clustrize_colors(Mat& src,Mat& dst)
{
// Number of clusters
int NrGMMComponents = 96;
cv::GaussianBlur(src,src,Size(3,3),1);
int srcHeight = src.rows;
int srcWidth = src.cols;
// Get datapoints
vector<Vec3d> ListSamplePoints;
for (int y=0; y<srcHeight; y++)
{
for (int x=0; x<srcWidth; x++)
{
// Collecting points from image
Vec3b bgrPixel = src.at<Vec3b>(y, x);
uchar b = bgrPixel.val[0];
uchar g = bgrPixel.val[1];
uchar r = bgrPixel.val[2];
if(rand()%25==0) // peek every 25-th
{
ListSamplePoints.push_back(Vec3d(b,g,r));
}
} // for (x)
} // for (y)
// Form training matrix
int NrSamples = ListSamplePoints.size();
Mat samples( NrSamples, 3, CV_64FC1 );
for (int s=0; s<NrSamples; s++)
{
Vec3d v = ListSamplePoints.at(s);
samples.at<double>(s,0) = (float) v[0];
samples.at<double>(s,1) = (float) v[1];
samples.at<double>(s,2) = (float) v[2];
}
//
cout << "Learning to represent the sample distributions with " << NrGMMComponents << " gaussians." << endl;
cout << "Started GMM training" << endl;
Ptr<cv::ml::EM> em_model;
cv::ml::EM::Params params(NrGMMComponents,cv::ml::EM::COV_MAT_GENERIC);
Mat labels(NrSamples,1,CV_32SC1);
Mat logLikelihoods( NrSamples, 1, CV_64FC1 );
// Train classifier
em_model=cv::ml::EM::train(samples,logLikelihoods,labels,noArray(),params);
cout << "Finished GMM training" << endl;
// result image
Mat img = Mat::zeros( Size( srcWidth, srcHeight ), CV_8UC3 );
// predict cluster
Mat sample( 1, 3, CV_64FC1 );
Mat means=em_model->getMeans();
for(int i = 0; i < img.rows; i++ )
{
for(int j = 0; j < img.cols; j++ )
{
Vec3b v=src.at<Vec3b>(i,j);
sample.at<double>(0,0) = (float) v[0];
sample.at<double>(0,1) = (float) v[1];
sample.at<double>(0,2) = (float) v[2];
int response = cvRound(em_model->predict( sample ));
img.at<Vec3b>(i,j)[0]=means.at<double>(response,0);
img.at<Vec3b>(i,j)[1]=means.at<double>(response,1);
img.at<Vec3b>(i,j)[2]=means.at<double>(response,2);
}
}
img.convertTo(img,CV_8UC3);
namedWindow("result",WINDOW_AUTOSIZE);
imshow("result",img);
imwrite("D:\nfr.jpg",img);
waitKey();
dst=img;
}
void processLayer(Mat& src,Mat& dst)
{
Mat tmp=src.clone();
Mat gx,gy,mag,blurred;
Sobel( src, gx, -1, 1, 0, 3);
Sobel( src, gy, -1, 0, 1, 3);
magnitude(gx,gy,mag);
//GaussianBlur(mag,blurred,Size(3,3),2);
//mag+=blurred;
normalize(mag,mag,0,1,cv::NORM_MINMAX);
//sqrt(mag,dst);
dst=mag.clone();
normalize(dst,dst,0,1,cv::NORM_MINMAX);
}
int main(int ac, char** av)
{
Mat clusterized;
Mat frame=imread("image path"); ////load an image//////
//resize(frame,frame,Size(256,256),0,0,INTER_LINEAR);
clustrize_colors(frame,clusterized);
clusterized.convertTo(clusterized,CV_32FC3,1.0/255.0);
frame.convertTo(frame,CV_32FC3,1.0/255.0);
Mat result1;
vector<Mat> ch;
split(frame, ch);
processLayer(ch[0],ch[0]);
processLayer(ch[1],ch[1]);
processLayer(ch[2],ch[2]);
merge(ch,result1);
result1=(0.5*frame-0.9*result1+0.3*clusterized)*2.0;
namedWindow("result1",WINDOW_AUTOSIZE);
imshow("result1",result1);
//cout<<result1;
imwrite("D:\finalresult.jpg",result1);
waitKey(0);
//destroyAllWindows();
return 0;
}
瓶颈很可能是opencv的cv::ml::EM::train方法。训练分类器并非易事。分类问题尚未最终解决。这就是为什么算法之间存在很大的权衡和差异的原因,更不用说跨不同的问题空间了。
至于性能,如果您坚持使用 EM,请查看 EM 类文档以及可能的父类以进行修改:
- 训练和/或的最大迭代次数
- 停止训练的期限标准。
由于使用第三方库,您无法做太多可以提高速度但不牺牲准确性的事情。另一方面,该库是开源的,并且可能经过了相当好的优化。我不建议尝试优化实际的库代码。
相关文章:
- 需要减少我的C++代码的执行时间
- 视觉在C 中获取每行代码的执行时间
- 测量执行时间 - 在程序代码或外壳中
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 两个代码段之间执行时间的奇怪差异
- 预先设置c++代码的执行时间
- 为什么要在我的OpenMP代码中增加执行时间
- 如何减少以下代码的执行时间
- 2个代码的执行时间的数目将不同
- 在 OpenMP 代码C++测量执行时间
- 如何减少以下代码的C++执行时间
- 当我从Java代码执行C++程序时,我应该如何测量它的执行时间
- C++和Haskell代码在不同机器上的执行时间不同
- 有什么方法可以减少这个代码的执行时间吗
- 英特尔TBB代码有不同的执行时间在windows和linux
- 如何获得一个c++代码段执行时间的客观评价
- 如何在c++中获得一段代码的执行时间
- 如何打印代码的执行时间
- 导出以下代码的执行时间增长率(BigO)
- 为什么相同的数组代码的执行时间之间存在差异