加速(1):多线程加速三张图片

来源:互联网 发布:蓝光原盘转换mp4软件 编辑:程序博客网 时间:2024/05/17 09:04

这个我也讲不太清楚,单纯的记录一下我的第一个多线程代码:

#include<opencv2/opencv.hpp>#include<thread>#include<Windows.h>#include<time.h>using namespace cv;using namespace std;//第1个线程void a1ThreadTask(const Mat& image,Mat &dst){//图像操作Mat map_x, map_y;//创建和输入图像大小的dst,map_x,map_ydst.create(image.size(), image.type());map_x.create(image.size(), CV_32FC1);map_y.create(image.size(), CV_32FC1);//【3】双层循环,遍历每一个像素点,改变map_x & map_y的值for (int j = 0; j < image.rows; j++){for (int i = 0; i < image.cols; i++){//改变map_x & map_y的值.// map_x.at<float>(j,i) = static_cast<float>(i);// map_y.at<float>(j,i) = static_cast<float>(img.rows - j);map_x.at<float>(j, i) = i;map_y.at<float>(j, i) = image.rows - j;}}//【4】进行重映射操作remap(image, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));//cout << "1" << endl;//Sleep(100);//cout << "111" << endl;//Sleep(100);}//第2个线程void a2ThreadTask(const Mat& image , Mat &dst){//图像操作//resize(image, dst, Size(100, 100));Mat map_x, map_y;//创建和输入图像大小的dst,map_x,map_ydst.create(image.size(), image.type());map_x.create(image.size(), CV_32FC1);map_y.create(image.size(), CV_32FC1);//【3】双层循环,遍历每一个像素点,改变map_x & map_y的值for (int j = 0; j < image.rows; j++){for (int i = 0; i < image.cols; i++){//改变map_x & map_y的值.// map_x.at<float>(j,i) = static_cast<float>(i);// map_y.at<float>(j,i) = static_cast<float>(img.rows - j);map_x.at<float>(j, i) = i;map_y.at<float>(j, i) = image.rows - j;}}//【4】进行重映射操作remap(image, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));//cout << "11" << endl;//Sleep(100);}//第3个线程void a3ThreadTask(const Mat& image, Mat &dst){//图像操作//resize(image, dst, Size(100, 100));Mat map_x, map_y;//创建和输入图像大小的dst,map_x,map_ydst.create(image.size(), image.type());map_x.create(image.size(), CV_32FC1);map_y.create(image.size(), CV_32FC1);//【3】双层循环,遍历每一个像素点,改变map_x & map_y的值for (int j = 0; j < image.rows; j++){for (int i = 0; i < image.cols; i++){//改变map_x & map_y的值.// map_x.at<float>(j,i) = static_cast<float>(i);// map_y.at<float>(j,i) = static_cast<float>(img.rows - j);map_x.at<float>(j, i) = i;map_y.at<float>(j, i) = image.rows - j;}}//【4】进行重映射操作remap(image, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));//cout << "3.0" << endl;}void imageProcess(const Mat image, Mat &dst){Mat map_x, map_y;//创建和输入图像大小的dst,map_x,map_ydst.create(image.size(), image.type());map_x.create(image.size(), CV_32FC1);map_y.create(image.size(), CV_32FC1);//【3】双层循环,遍历每一个像素点,改变map_x & map_y的值for (int j = 0; j < image.rows; j++){for (int i = 0; i < image.cols; i++){//改变map_x & map_y的值.// map_x.at<float>(j,i) = static_cast<float>(i);// map_y.at<float>(j,i) = static_cast<float>(img.rows - j);map_x.at<float>(j, i) = i;map_y.at<float>(j, i) = image.rows - j;}}//【4】进行重映射操作remap(image, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));}int main(){std::vector<cv::Mat> inImgs;Mat result;Mat img00 = imread("img07.JPG");Mat img11 = imread("img08.JPG");Mat img22 = imread("img09.JPG");inImgs.push_back(img00);inImgs.push_back(img11);inImgs.push_back(img22);Mat dst;long t1 = GetTickCount();//clock_t t1 = clock();int ii = 50;while (ii--){#if 0//没有使用多线程for (size_t i = 0; i < inImgs.size(); i++){imageProcess(inImgs.at(i), dst);}#endif#if 1//使用了多线程//创建三个线程thread my1ThreadTask(a1ThreadTask,inImgs.at(0), dst);thread my2ThreadTask(a2ThreadTask,inImgs.at(1), dst);thread my3ThreadTask(a3ThreadTask,inImgs.at(2), dst);//Join等待线程my1ThreadTask.join();my2ThreadTask.join();my3ThreadTask.join();#endif//clock_t t2 = clock();}std::cout << "time: " << GetTickCount() - t1 << std::endl;getchar();return 0;}
使用多线程的目的是能够对图像处理加速,然后这样运行了50次(每张图片):

不使用多线程的时候,时间为越5265;

使用了三个多线程时间为约2875ms。

现在还不能验证这个多线程对于图片加速的能力,继续找加速的方法。


0 0