opencv常用API记录(C++版)

文章目录

  • 1. cv::Mat(cv::Rect) 是什么含义
  • 2. cv::Mat初始化 cv::Mat(1, 32, CV_32F,XXX)什么意思
  • 3. 如何使用opencv的多线程接口来跑多张图的resize

1. cv::Mat(cv::Rect) 是什么含义

cv::Mat(cv::Rect) 是一种使用矩形区域来构造新的 cv::Mat 对象的方式,其中 cv::Rect 是 OpenCV 库中的一个类,用于表示矩形区域的坐标和大小。

具体来说,cv::Mat(cv::Rect) 的含义是根据给定的矩形区域,在原始 cv::Mat 对象上提取或复制一个新的矩形区域,并将该区域作为一个新的 cv::Mat 对象返回。

下面是一个示例,演示了如何使用 cv::Mat(cv::Rect) 构造函数从原始图像中提取矩形区域:

#include 

int main() {
    cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
    if (image.empty()) {
        return -1;
    }

    // 定义一个矩形区域(左上角坐标和宽高)
    cv::Rect roi(100, 100, 200, 150);

    // 使用矩形区域构造新的 Mat 对象
    cv::Mat regionOfInterest = image(roi);

    cv::imshow("Original Image", image);
    cv::imshow("Region of Interest", regionOfInterest);

    cv::waitKey(0);
    return 0;
}

在这个示例中,我们首先定义了一个矩形区域 roi,然后使用 image(roi) 来构造一个新的 cv::Mat 对象 regionOfInterest,该对象包含了原始图像中指定矩形区域的像素数据。

总之,cv::Mat(cv::Rect) 是一种通过矩形区域在原始图像上提取或复制像素数据来构造新的 cv::Mat 对象的方式。

2. cv::Mat初始化 cv::Mat(1, 32, CV_32F,XXX)什么意思

cv::Mat(1, 32, CV_32F, XXX) 是用于创建一个 cv::Mat 对象的构造函数调用,其中的参数表示以下内容:

  • 1:表示要创建的矩阵的行数。
  • 32:表示要创建的矩阵的列数。
  • CV_32F:表示矩阵的数据类型,这里是单精度浮点数(32 位浮点数)。
  • XXX:表示要初始化矩阵的数据。

具体来说,这个构造函数用于创建一个 1x32 大小的单精度浮点数矩阵,并且可以通过提供的数据 XXX 进行初始化。

以下是一个示例,演示了如何使用这个构造函数来初始化 cv::Mat 对象:

#include 

int main() {
    float initData[32] = {1.0, 2.0, 3.0, /* ... */, 31.0, 32.0};

    cv::Mat mat(1, 32, CV_32F, initData);

    // 输出矩阵内容
    std::cout << mat << std::endl;

    return 0;
}

在这个示例中,我们创建了一个 1x32 的单精度浮点数矩阵,并使用名为 initData 的数组进行了初始化。数组中的元素依次填充到矩阵的每个列。

总之,cv::Mat(1, 32, CV_32F, XXX) 构造函数调用用于创建一个特定大小和数据类型的 cv::Mat 对象,并通过提供的数据进行初始化。

3. 如何使用opencv的多线程接口来跑多张图的resize

    1. 单循环

使用 OpenCV 的多线程接口来同时处理多张图像的 cv::resize 操作可以提高图像处理的效率。OpenCV 提供了 cv::parallel_for_ 函数来实现多线程处理图像。

以下是一个示例,演示如何使用 OpenCV 的多线程接口来同时处理多张图像的尺寸调整操作:

#include 
#include 
#include 

void resizeImages(cv::UMat& srcImage, cv::UMat& dstImage, const cv::Size& newSize) {
    cv::resize(srcImage, dstImage, newSize, 0, 0, cv::INTER_LINEAR);
}

int main() {
    std::vector<cv::UMat> srcImages; // 源图像数组
    std::vector<cv::UMat> dstImages; // 目标图像数组

    // 加载图像并存储在源图像数组中(省略部分代码)

    // 定义目标尺寸
    cv::Size newSize(320, 240);

    // 使用多线程处理图像尺寸调整
    cv::parallel_for_(cv::Range(0, srcImages.size()), [&](const cv::Range& range) {
        for (int i = range.start; i < range.end; ++i) {
            cv::UMat dstImage;
            resizeImages(srcImages[i], dstImage, newSize);
            dstImages.push_back(dstImage);
        }
    });

    // 显示结果(省略部分代码)

    return 0;
}

在这个示例中,我们定义了一个函数 resizeImages,用于调整图像的尺寸。然后,使用 cv::parallel_for_ 函数在多个线程中并行处理图像的尺寸调整操作。通过这种方式,可以提高图像处理的效率。需要注意的是,在多线程环境下,确保线程安全,避免竞态条件和数据共享问题。

使用 cv::parallel_for_ 函数可以更有效地利用多核 CPU 来处理图像,但也要确保你的操作是线程安全的。如果操作涉及共享资源,需要进行适当的同步控制,以避免线程冲突。

    1. 双循环

cv::parallel_for_ 函数适用于并行处理单一循环范围,如果你想要并行处理双重循环并优化内层循环,可以将内层循环拆分成更小的任务单元,然后使用 cv::parallel_for_ 来处理每个内层任务。

以下是一个示例,演示如何使用 cv::parallel_for_ 并行处理双重循环,并针对内层循环进行优化:

#include 
#include 
#include 

int main() {
    const int rows = 1000;
    const int cols = 1000;
    cv::Mat matA(rows, cols, CV_32FC1);
    cv::Mat matB(rows, cols, CV_32FC1);
    cv::Mat matC(rows, cols, CV_32FC1);

    // 初始化矩阵 A 和 B(省略部分代码)

    // 并行处理双重循环,优化内层循环
    cv::parallel_for_(cv::Range(0, rows), [&](const cv::Range& rowRange) {
        for (int i = rowRange.start; i < rowRange.end; ++i) {
            // 使用 cv::parallel_for_ 并行处理内层循环
            cv::parallel_for_(cv::Range(0, cols), [&](const cv::Range& colRange) {
                for (int j = colRange.start; j < colRange.end; ++j) {
                    matC.at<float>(i, j) = matA.at<float>(i, j) + matB.at<float>(i, j);
                }
            });
        }
    });

    // 显示结果(省略部分代码)

    return 0;
}

在这个示例中,我们首先使用外层的 cv::parallel_for_ 来处理行循环,然后在内层使用另一个 cv::parallel_for_ 来处理列循环。通过将内层循环划分成更小的任务单元,可以充分利用多核处理器并加速处理。

需要注意的是,并行处理的粒度要适当,避免过细的任务划分造成额外的线程开销。根据实际情况进行权衡和调整,以达到最佳的性能提升。

你可能感兴趣的:(深度学习,工程技术,opencv,c++,计算机视觉)