Openmp
我把它简单理解为并行加速,做图像处理时特别有用,可以以最简单的方法极大的提升效率,节约时间,特别是高分辨率图像处理。
使用openmp,在vs中使用需要将openmp勾选一下,
然后加上头文件<omp.h>,
下面是使用例子
void OpenmpTest()
{
cv::Mat img;
//img.create(cv::Size(2880, 1440), CV_32FC1);
img = cv::Mat(cv::Size(2880, 1440), CV_32FC1, cv::Scalar(12));
//img.create(cv::Size(2880, 1440), CV_8UC1);
int i, j;
int w = img.cols;
int h = img.rows;
int k;
int up = 50;
float *data = (float *)img.data;
//uchar *data = img.data;
int64 tt;
tt = cv::getTickCount();
#pragma omp parallel for
for (i = 0; i < h; i++)
{
#pragma omp parallel for
for (j = 0; j < w - 1; j++)
{
//data[i * w + j] = data[i * w + j] * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9;
//#pragma omp parallel for
//for (k = 0; k < up; k++)
{
//data[i * w + j] = data[i * w + j] + data[i * w + j] * 50.8 / 64.1;
//data[i * w + j] = (float)50.8;
//data[i * w + j + 1] = (float)50.8;
data[i * w + j] = data[i * w + j] * data[i * w + j + 1];
//img.at<float>(h, w) = (float)50.8;
}
}
}
std::cout << "openmp: " << (cv::getTickCount() - tt) / cv::getTickFrequency() * 1000 << "ms" << std::endl;
//tt = cv::getTickCount();
//for (i = 0; i < h; i++)
//{
// for (j = 0; j < w; j++)
// {
// //data[i * w + j] = data[i * w + j] * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9 * 38.9 / 100.9;
// for (k = 0; k < up; k++)
// {
// data[i * w + j] = data[i * w + j] + data[i * w + j] * 50.8 / 64.1;
// }
// }
//}
//std::cout << "normal: " << (cv::getTickCount() - tt) / cv::getTickFrequency() * 1000 << "ms" << std::endl;
}
img是一幅自建的图像,直接取址赋值就行,但是测试.at<h,w>程序就崩掉。
如果调用的库有使用openmp,那主程序最好也勾选上支持,否则有可能出错,目前不清楚是哪里出错,但是不勾选最后生成的应用程序在win7上跑特别慢。