轉 OpenCV Mat 數據讀寫


轉:https://blog.csdn.net/u011520181/article/details/83831866

1、創建 Mat 對象:


  
  
  
          
  1. // 創建一個 320x240 的 8 位無符號型 4 通道全 0 的 Mat
  2. cv::Mat mBGRAImg = cv::Mat::zeros( 320, 240, CV_8UC4);
  3. // 創建一個 320x240 的 8 位無符號型 1 通道全 0 的 Mat
  4. cv::Mat mGrayImg = cv::Mat::zeros( 320, 240, CV_8UC1);

    對於 type,格式為:CV_位數+數值類型+C通道數,例如:
    CV_8UC1 表示:單通道陣列,8bit 無符號整數
    CV_8UC4 表示:4 通道陣列,8bit 無符號整數
    CV_32FC1 表示:單通道陣列,32bit float 型

 

2、給 Mat 賦值:

① 從文件中讀取圖片到 Mat 中:


  
  
  
          
  1. // 從文件中讀取內容到 Mat 中
  2. cv::Mat image = cv::imread(file_path, cv::IMREAD_UNCHANGED);
  3. // 將 RGBA 數據轉成灰度數據
  4. cv::Mat gray;
  5. cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);

② 將 RGBA 裸數據賦值給 Mat:


  
  
  
          
  1. // 創建一個 320x240 的 8 位無符號型 4 通道全 0 的 Mat
  2. cv::Mat mRGBAImg = cv::Mat::zeros( 320, 240, CV_8UC4);
  3. // 創建一個 320x240 的 8 位無符號型 1 通道全 0 的 Mat
  4. cv::Mat mGrayImg = cv::Mat::zeros( 320, 240, CV_8UC1);
  5. //方法一:直接將數據指針賦值給 mat.data
  6. // 假設已經有了 RGBA 裸數據,如從 OpenGL 中 glReadPixels 讀出來的
  7. // 或從 java 層傳下來的:jbyte * mPicData = env->GetByteArrayElements(picture, NULL);
  8. uchar * rgba_data = xxx;
  9. mRGBAImg.data = (uchar *) rgba_data;
  10. // 將 RGBA 數據轉成灰度數據
  11. cv::cvtColor(mRGBAImg, gGrayImg, cv::COLOR_RGBA2GRAY);
  12. //方法二:依次給 Mat 每個元素賦值
  13. for ( int i = 0; i < height; ++i) {
  14. for ( int j = 0; j < width; ++j) {
  15. // RGBA ==> cv::RGBA
  16. mRGBAImg.at<cv::Vec3b>(i, j)[ 0] = (mPicData[(i * width + j) * 4 + 0] & 0xFF);
  17. mRGBAImg.at<cv::Vec3b>(i, j)[ 1] = (mPicData[(i * width + j) * 4 + 1] & 0xFF);
  18. mRGBAImg.at<cv::Vec3b>(i, j)[ 2] = (mPicData[(i * width + j) * 4 + 2] & 0xFF);
  19. mRGBAImg.at<cv::Vec3b>(i, j)[ 3] = (mPicData[(i * width + j) * 4 + 3] & 0xFF);
  20. }
  21. }

 

3、讀取 Mat 中的數據:

將 Mat 中的數據輸出:


  
  
  
          
  1. // 如將人臉關鍵點坐標的 Mat 拼成字符串輸出出來
  2. char str[ 2024];
  3. int offset = 0;
  4. for ( int i = 0; i < face_key_pionts.rows; i+= 2) {
  5. for ( int j = 0; j < face_key_pionts.cols; ++j) {
  6. offset += sprintf(str + offset, "(%f, %f), ", face_key_pionts.at< float>(i, j), face_key_pionts.at< float>(i + 1, j));
  7. }
  8. }
  9. LOGE( "FacePointTest()-->>face_key_pionts = %s\n", str);

② 將 Mat 中的數據保存成文件:


  
  
  
          
  1. // 從文件中讀取圖片,並保存為 RGBA 裸數據
  2. cv::Mat image = cv::imread(img_file, cv::IMREAD_UNCHANGED);
  3. FILE * rgba_file = fopen(rgba_file_path, "wb");
  4. fwrite(image.data, image.elemSize(), image.cols * image.rows, rgba_file);
  5. fclose(rgba_file);
  6. // 將 RGBA 數據轉成灰度數據並保存成文件
  7. cv::Mat gray;
  8. cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
  9. FILE * gray_file = fopen(gray_file_path, "wb");
  10. fwrite(gray.data, gray.elemSize(), gray.cols * gray.rows, gray_file);
  11. fclose(gray_file);

③ 圖像裸數據 在線查看

    http://rawpixels.net

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM