OpenCV Mat 資料讀寫
阿新 • • 發佈:2018-12-20
1、建立 Mat 物件:
// 建立一個 320x240 的 8 位無符號型 4 通道全 0 的 Mat
cv::Mat mBGRAImg = cv::Mat::zeros(320, 240, CV_8UC4);
// 建立一個 320x240 的 8 位無符號型 1 通道全 0 的 Mat
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 中:
// 從檔案中讀取內容到 Mat 中
cv::Mat image = cv::imread(file_path, cv::IMREAD_UNCHANGED);
// 將 RGBA 資料轉成灰度資料
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
② 將 RGBA 裸資料賦值給 Mat:
// 建立一個 320x240 的 8 位無符號型 4 通道全 0 的 Mat cv::Mat mRGBAImg = cv::Mat::zeros(320, 240, CV_8UC4); // 建立一個 320x240 的 8 位無符號型 1 通道全 0 的 Mat cv::Mat mGrayImg = cv::Mat::zeros(320, 240, CV_8UC1); //方法一:直接將資料指標賦值給 mat.data // 假設已經有了 RGBA 裸資料,如從 OpenGL 中 glReadPixels 讀出來的 // 或從 java 層傳下來的:jbyte * mPicData = env->GetByteArrayElements(picture, NULL); uchar * rgba_data = xxx; mRGBAImg.data = (uchar *) rgba_data; // 將 RGBA 資料轉成灰度資料 cv::cvtColor(mRGBAImg, gGrayImg, cv::COLOR_RGBA2GRAY); //方法二:依次給 Mat 每個元素賦值 for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { // RGBA ==> cv::RGBA mRGBAImg.at<cv::Vec3b>(i, j)[0] = (mPicData[(i * width + j) * 4 + 0] & 0xFF); mRGBAImg.at<cv::Vec3b>(i, j)[1] = (mPicData[(i * width + j) * 4 + 1] & 0xFF); mRGBAImg.at<cv::Vec3b>(i, j)[2] = (mPicData[(i * width + j) * 4 + 2] & 0xFF); mRGBAImg.at<cv::Vec3b>(i, j)[3] = (mPicData[(i * width + j) * 4 + 3] & 0xFF); } }
3、讀取 Mat 中的資料:
① 將 Mat 中的資料輸出:
// 如將人臉關鍵點座標的 Mat 拼成字串輸出出來 char str[2024]; int offset = 0; for (int i = 0; i < face_key_pionts.rows; i+=2) { for (int j = 0; j < face_key_pionts.cols; ++j) { offset += sprintf(str + offset, "(%f, %f), ", face_key_pionts.at<float>(i, j), face_key_pionts.at<float>(i + 1, j)); } } LOGE("FacePointTest()-->>face_key_pionts = %s\n", str);
② 將 Mat 中的資料儲存成檔案:
// 從檔案中讀取圖片,並儲存為 RGBA 裸資料
cv::Mat image = cv::imread(img_file, cv::IMREAD_UNCHANGED);
FILE * rgba_file = fopen(rgba_file_path, "wb");
fwrite(image.data, image.elemSize(), image.cols * image.rows, rgba_file);
fclose(rgba_file);
// 將 RGBA 資料轉成灰度資料並儲存成檔案
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
FILE * gray_file = fopen(gray_file_path, "wb");
fwrite(gray.data, gray.elemSize(), gray.cols * gray.rows, gray_file);
fclose(gray_file);
③ 影象裸資料 線上檢視