OpenCV Mat转dlib array2d

在做一个人脸检测相关的项目,用到dlib,一个OpenCV Mat转dlib array2d的小技巧,就不需要存盘再读出来了。
#include "opencv2/core/core_c.h" // shame, but needed for using dlib
#include <dlib/image_processing.h>
#include <dlib/opencv/cv_image.h>

dlib::shape_predictor sp;
dlib::deserialize(path_to_landmark_model) >> sp;

cv::Rect r;
cv::Mat I;
dlib::rectangle rec(r.x, r.y, r.x+r.width, r.y+r.height);
dlib::full_object_detection shape = sp(dlib::cv_image<uchar>(I), rec);


点击打开链接 看到的,之前看到的都是存盘再读出来做类型转换的。

在将 `array2d<rgb_pixel>` 换为 `cv::Mat` 时,需要注意两个问题: 1. `array2d<rgb_pixel>` 的存储顺序是按行存储的,而 `cv::Mat` 的存储顺序是按列存储的,因此需要进行置操作。 2. `array2d<rgb_pixel>` 的像素值的类型是 `rgb_pixel`,而 `cv::Mat` 的像素值的类型是 `cv::Vec3b`,需要进行类型转换。 下面是一个示例代码,可以将 `array2d<rgb_pixel>` 换为 `cv::Mat`: ```cpp #include <iostream> #include <dlib/image_processing.h> #include <opencv2/opencv.hpp> using namespace std; using namespace dlib; int main() { // 创建一个 array2d<rgb_pixel> array2d<rgb_pixel> img(100, 100); for (int r = 0; r < img.nr(); r++) { for (int c = 0; c < img.nc(); c++) { img[r][c] = rgb_pixel(r, c, 255); } } // 将 array2d<rgb_pixel> 换为 cv::Mat cv::Mat mat(img.nc(), img.nr(), CV_8UC3, cv::Scalar(0, 0, 0)); for (int r = 0; r < img.nr(); r++) { for (int c = 0; c < img.nc(); c++) { cv::Vec3b& pixel = mat.at<cv::Vec3b>(c, r); rgb_pixel& dlib_pixel = img[r][c]; pixel[0] = dlib_pixel.blue; pixel[1] = dlib_pixel.green; pixel[2] = dlib_pixel.red; } } cv::transpose(mat, mat); // 置 // 显示结果 cv::imshow("image", mat); cv::waitKey(0); return 0; } ``` 在这个示例代码中,我使用了一个简单的方法来将 `array2d<rgb_pixel>` 换为 `cv::Mat`,也就是先创建一个空的 `cv::Mat`,然后逐个像素进行复制和类型转换。最后再使用 `cv::transpose` 将 `cv::Mat` 置,以满足存储顺序的要求。 如果你还是遇到了 `cv::Mat` 是空的问题,可以检查一下你的 `array2d<rgb_pixel>` 是否为空,以及是否正确地换为了 `cv::Mat`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值