dlib opencv各种图像类的转换
IplImage, CvMat, Mat 的关系 相互转换
https://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html
| |
| Ptr<IplImage> iplimg(cvLoadImage(imagename.c_str())); |
| if(!iplimg) |
| { |
| fprintf(stderr, "Can not load image %s\n", imagename.c_str()); |
| return -1; |
| } |
| Mat img = cv::cvarrToMat(iplimg); |
| |
| |
| |
| |
| BYTE pBuffer[65536]; |
| |
| |
| std::vector<BYTE> pFaceBuffs; |
| |
| pFaceBuffs.clear(); |
| pFaceBuffs.reserve(len); |
| |
| |
| for (size_t i = 0; i<len; i++) |
| { |
| pFaceBuffs.push_back(pBuffer[i]); |
| } |
| |
| Mat faceIDImg = imdecode(Mat(pFaceBuffs), IMREAD_COLOR); |
| if (faceIDImg.data == nullptr) { continue; } |
| |
| m_nIDPhotoWidth = faceIDImg.cols; |
| m_nIDPhotoHeight = faceIDImg.rows; |
| |
| |
| |
| Mat (const std::vector< _Tp > &vec, bool copyData=false) |
| |
| template<typename _Tp , int n> |
| Mat (const Vec< _Tp, n > &vec, bool copyData=true) |
| |
| template<typename _Tp , int m, int n> |
| Mat (const Matx< _Tp, m, n > &mtx, bool copyData=true) |
| |
| template<typename _Tp > |
| Mat (const Point_< _Tp > &pt, bool copyData=true) |
| |
| template<typename _Tp > |
| Mat (const Point3_< _Tp > &pt, bool copyData=true) |
| |
| template<typename _Tp > |
| |
| |
| cv::Mat img; |
| |
| struct rgb_pixel |
| { |
| |
| |
| rgb_pixel( |
| ) {} |
| |
| rgb_pixel( |
| unsigned char red_, |
| unsigned char green_, |
| unsigned char blue_ |
| ) : red(red_), green(green_), blue(blue_) {} |
| |
| unsigned char red; |
| unsigned char green; |
| unsigned char blue; |
| }; |
图片格式
640*480
1.若 用rgb_pixel
| [0,0]r [0,0]g [0,0]b ........[0,640]r [0,640 ]g [0,640]b |
| . |
| . |
| . |
| [480,0]r [480,0 ]g [480,0]b ........[480,640]r [480,640 ]g [480,640]b |
2.如果rgb 各占用一个 640*480*3
| r g b r g b |
| [0,0] [0,1] [0,2] ................[0,3*640] [0,3*640+1] [0,3*640+2] |
| . |
| . |
| . |
| [480,0] [480,1] [480,2] ................[480,3*640] [480,3*640+1] [480,3*640+2] |
- 一维数组 最常用 img.data();也是这样排列
| |
| r g b r g b |
| [0],[1],[2]............... [640*480*3+0],[640*480*3 +1],[640*480*3+2] |
| |
4.cv::Mat 存储方式
- BYTE[][] RGB 图片转换为 array2d<rgb_pixel> 再转换为 matrix<rgb_pixel>
| INT32 Convert2Array2d(BYTE** r, BYTE** g, BYTE** b, UINT32 imgWidth, UINT32 imgHeight,.......) |
| { |
| dlib::array2d<rgb_pixel> img; |
| img.set_size(imgWidth, imgHeight); |
| |
| |
| for (UINT32 i = 0; i < imgWidth; i++) |
| { |
| |
| for (UINT32 j = 0; i < imgHeight; i++) |
| { |
| img[i][j] = rgb_pixel(r[i][j], g[i][j], b[i][j]); |
| } |
| } |
| |
| matrix<rgb_pixel> videoFrame; |
| assign_image(videoFrame, img); |
| } |
| |
2.BYTE[][] RGB 图片直接转换为 matrix<rgb_pixel>
| |
| |
| matrix<rgb_pixel> img; |
| img.set_size(imgHeight, imgWidth); |
| |
| |
| for (UINT32 i = 0; i < imgWidth; i++) |
| { |
| |
| for (UINT32 j = 0; i < imgHeight; i++) |
| { |
| img(i,j) = rgb_pixel(r[i][j], g[i][j], b[i][j]); |
| } |
| } |
| |
- CV::Mat 转换为 dlib::matrixdlib::rgb_pixel
//加入opencv的mat 转换要 载入opencv lib
//#include <dlib/opencv/to_open_cv.h>
//#include <dlib/opencv/cv_image.h>
| |
| dlib::matrix<dlib::rgb_pixel> imgFrame; |
| assign_image(imgFrame, dlib::cv_image<dlib::rgb_pixel>(videoFrame)); 此处videoFrame是cv::Mat格式 |
| |
| |
| |
| cv::Mat cvMatImage; |
| cap >> cvMatImage; |
| |
| |
| dlib::array2d<bgr_pixel> dlibImage; |
| dlib::assign_image(dlibImage, dlib::cv_image<bgr_pixel>(cvMatImage)); |
| |
| |
| dlib::array2d<unsigned char> dlibImageGray; |
| dlib::assign_image(imgFrame, dlib::cv_image<unsigned char>(cvMatImageGray)); |
| |
4.vectir<vectordlib::rgb_pixel> 转 dlib::matrixdlib::rgb_pixel
| std::vector<std::vector<rgb_pixel>> imageFrame, UINT32 imgWidth, UINT32 imgHeight, |
| |
| |
| |
| |
| matrix<rgb_pixel> videoFrame; |
| videoFrame.set_size(imgHeight, imgWidth); |
| |
| |
| for (UINT32 i = 0; i < imgWidth; i++) |
| { |
| |
| for (UINT32 j = 0; i < imgHeight; i++) |
| { |
| videoFrame(i,j) = imageFrame[i][j]; |
| } |
| } |
| |
| |
- dlib::matrixdlib::rgb_pixel 转 vectir<vectordlib::rgb_pixel>
| |
| std::vector<std::array<float, FEATURE_SIZE>> face_Feature_descriptors |
| |
| std::vector<matrix<float, 0, 1>> vecMatrixFeature; |
| {.......... |
| |
| |
| face_Feature_descriptors.reserve(vecMatrixFeature.size()); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| for (matrix<float, 0, 1> matrixFeature : vecMatrixFeature) |
| { |
| std::array<float, FEATURE_SIZE> arrayFaceFeature; |
| for (long c = 0; c < FEATURE_SIZE; ++c) |
| { |
| arrayFaceFeature[c] = matrixFeature(0, c); |
| } |
| |
| face_Feature_descriptors.push_back(arrayFaceFeature); |
| } |
| |
| |
| |
- vector<vector<vector<rgb_pixel>>> 转 vector<matrix<rgb_pixel>>
| vector<vector<vector<rgb_pixel>>> faces_chip |
| |
| |
| vector<matrix<rgb_pixel>> vecMatrixFacesChip; |
| |
| |
| for(std::vector<std::vector<rgb_pixel>> face_chip : faces_chip) |
| { |
| matrix<rgb_pixel> matrixFacesChip; |
| for (UINT32 r = 0; r < face_chip.size(); r++) |
| { |
| for (UINT32 c = 0; c < faces_chip[r].size(); c++) |
| { |
| if (c == 0) |
| { |
| matrixFacesChip.set_size(face_chip.size(), faces_chip[r].size()); |
| } |
| |
| matrixFacesChip(r, c) = face_chip[r][c]; |
| |
| vecMatrixFacesChip.push_back(move(matrixFacesChip)); |
| } |
| } |
| } |
| |
如果效率低,就改成 结构体 指针
strcut
{
BYTE** R;
BYTE** G;
BYTE** B;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2018-11-04 Jlink flash 烧录HEX 程序
2015-11-04 process thread Fiber(linux)