轉:https://blog.csdn.net/u011520181/article/details/83831866
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);
③ 圖像裸數據 在線查看