使用了 thread 线程库
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
#define THREAD_NUMS 3
struct paramThread
{
int w;
int h;
uchar * data;
};
void * threadProcess(void* args) {
pthread_t myid = pthread_self();
paramThread *para = (paramThread *)args;
int w = para->w;
int h = para->h;
cv::Mat image(h,w,CV_8UC3,(uchar *)para->data);
cv::blur(image, image,cv::Size(7,7), cv::Point(-1, -1), cv::BORDER_REPLICATE);
pthread_exit(NULL);
return NULL;
}
vector<cv::Mat> splitImage(cv::Mat image, int num,int type) {
int rows = image.rows;
int cols = image.cols;
vector<cv::Mat> v;
if (type == 0) {
for (size_t i = 0; i < num; i++) {
int star = rows / num*i;
int end = rows / num*(i + 1);
if (i == num - 1) {
end = rows;
}
v.push_back(image.rowRange(star, end));
}
}
else if (type == 1) {
for (size_t i = 0; i < num; i++){
int star = cols / num*i;
int end = cols / num*(i + 1);
if (i == num - 1) {
end = cols;
}
v.push_back(image.colRange(star, end).clone());
}
}
return v;
}
cv::Mat catImage(vector<cv::Mat> v, int type) {
cv::Mat dest= v.at(0);
for (size_t i = 1; i < v.size(); i++)
{
if (type == 0)
{
cv::vconcat(dest, v.at(i), dest);
}
else if (type == 1)
{
cv::hconcat(dest, v.at(i), dest);
}
}
return dest;
}
int main() {
string path = "/home/mayang/Firefox_wallpaper.png";
cv::Mat src = cv::imread(path);
printf("image size = w=%d, h=%d\n", src.cols, src.rows);
cv::Mat image1 = src.clone();
cv::Mat image2 = src.clone();
cv::imshow("src", src); cv::waitKey(30);
double T0 = static_cast<double>(cv::getTickCount());
cv::blur(image1, image1, cv::Size(7, 7));
double T1 = static_cast<double>(cv::getTickCount());
int type = 0;
vector<cv::Mat> v = splitImage(image2, THREAD_NUMS, type);
paramThread args[THREAD_NUMS];
pthread_t pt[THREAD_NUMS];
for (size_t i = 0; i < THREAD_NUMS; i++)
{
args[i].h = v.at(i).rows;
args[i].w = v.at(i).cols;
args[i].data = v.at(i).data;
pthread_create(&pt[i], NULL, &threadProcess, (void *)(&args[i]));
}
for (size_t i = 0; i < THREAD_NUMS; i++)
{
pthread_join(pt[i], NULL);
}
cv::Mat dest = catImage(v, type);
double T2 = static_cast<double>(cv::getTickCount());
printf(" run times = %3.3fms\n", (T1 - T0)*1000 / cv::getTickFrequency());
printf("Thread run times = %3.3fms\n,", (T2 - T1)*1000 / cv::getTickFrequency());
cv::imshow("dest", dest); cv::waitKey(30);
cv::imshow("image2", image2); cv::waitKey(30);
cv::waitKey(0);
return 0;
}
CmakeLists 配置
cmake_minimum_required(VERSION 3.14)
project(untitled)
set(CMAKE_CXX_STANDARD 14)
find_package(OpenCV REQUIRED)
set(SOURCE_FILES main.cpp)
add_executable(untitled ${
SOURCE_FILES})
include_directories(${
OpenCV_INCLUDE_DIRS})
target_link_libraries(untitled ${
OpenCV_LIBS} boost_thread -pthread)