这个我也讲不太清楚,单纯的记录一下我的第一个多线程代码:
#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。
现在还不能验证这个多线程对于图片加速的能力,继续找加速的方法。