array2d<rgb_pixel> 转 cv::mat
时间: 2024-01-20 18:02:57 浏览: 81
你可以使用 OpenCV 库中的 `cv::Mat` 类来实现 `array2d<rgb_pixel>` 到 `cv::Mat` 的转换。下面是一个简单的示例代码:
```c++
// 假设有一个名为 img 的 array2d<rgb_pixel> 对象
cv::Mat mat(img.nr(), img.nc(), CV_8UC3);
for (int r = 0; r < img.nr(); ++r) {
for (int c = 0; c < img.nc(); ++c) {
const dlib::rgb_pixel& p = img[r][c];
cv::Vec3b& q = mat.at<cv::Vec3b>(r, c);
q[0] = p.blue;
q[1] = p.green;
q[2] = p.red;
}
}
```
这里我们先创建了一个 `cv::Mat` 对象,并设置其大小为 `img.nr()` 行、`img.nc()` 列,像素格式为 8 位 3 通道。然后我们使用双重循环遍历 `img` 中的每个像素,并将其转换为 `cv::Vec3b` 类型的像素值,再将其赋值给对应位置的 `mat` 中的像素。注意到 `cv::Mat` 中的像素格式是 BGR,而 `dlib::rgb_pixel` 中的像素格式是 RGB,因此需要做一些通道的交换。
相关问题
帮我解释一下这段代码的作用 array2d<rgb_pixel> img = mat_to_array2d(mat); pyramid_up(img); std::vector<rectangle> dets = detector(img); // 矫正每个人脸 std::vector<cv::Mat> faces; std::vector<full_object_detection> shapes; for (unsigned long j = 0; j < dets.size(); ++j){ full_object_detection shape = sp(img, dets[j]); shapes.push_back(shape); } dlib::array<array2d<rgb_pixel>> face_chips; extract_image_chips(img, get_face_chip_details(shapes), face_chips); for(auto it = face_chips.begin(); it != face_chips.end(); it++) { cv::Mat mat_(img.nc(), img.nr(), CV_8UC3, cv::Scalar(0, 0, 0)); array2d_to_mat(*it, mat); faces.push_back(mat); }
这段代码主要是用来对输入图片中的人脸进行检测和矫正,最后将矫正后的人脸图像保存到一个 vector 中。
具体来说,它首先将输入的 OpenCV 格式的图像 mat 转换成了 Dlib 中的 array2d<rgb_pixel> 格式的图像 img。然后使用 pyramid_up 函数将 img 进行金字塔上采样,以提高人脸检测的精度。
接着,使用 detector 函数对经过上采样后的 img 进行人脸检测,得到一个矩形框(rectangle)的向量 dets,其中每个矩形框表示检测到的一个人脸。
然后,对每个矩形框进行形状(shape)的矫正,得到一个全局形状(full_object_detection)的向量 shapes,其中每个全局形状表示一个人脸的关键点(如眼睛、鼻子、嘴巴等)在 img 中的位置。
接着,使用 extract_image_chips 函数将每个矫正后的人脸从 img 中提取出来,保存到 face_chips 向量中。
最后,使用 array2d_to_mat 函数将 face_chips 中的人脸图像转换为 OpenCV 格式的图像 mat,并将其保存到 faces 向量中。这个 faces 向量中存储了所有检测到的人脸图像,可以用于后续的人脸识别或其他处理。
c++ 将cv::mat 转为 array2d<rgb_pixel>
你可以使用以下代码将 cv::Mat 转换为 dlib 的 array2d<rgb_pixel> 类型:
```cpp
#include <dlib/image_processing.h>
#include <dlib/image_io.h>
using namespace dlib;
// 将 cv::Mat 转为 array2d<rgb_pixel>
array2d<rgb_pixel> mat_to_array2d(const cv::Mat& img)
{
// 创建一个空的 array2d<rgb_pixel> 对象
array2d<rgb_pixel> out_img(img.rows, img.cols);
// 遍历每一个像素,将其赋值给 array2d<rgb_pixel> 对象
for (int r = 0; r < img.rows; ++r) {
for (int c = 0; c < img.cols; ++c) {
const cv::Vec3b& bgr = img.at<cv::Vec3b>(r, c);
out_img[r][c] = rgb_pixel(bgr[2], bgr[1], bgr[0]);
}
}
return out_img;
}
```
然后你就可以使用以上函数将 cv::Mat 转换为 dlib 的 array2d<rgb_pixel> 类型了。
阅读全文