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

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

#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_y
	dst.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_y
	dst.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_y
	dst.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_y
	dst.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。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫与橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值