OpenCV Mat詳細
2802 ワード
MatはOpenCVストレージオブジェクトユニットで、一般的にデータを格納または変換する際に使用する必要があります.
1.Matオブジェクトの作成
typeの場合、フォーマットは:CV_ビット数+数値タイプ+Cチャネル数(例:CV_8 UC 1表示:シングルチャネルアレイ、8 bit符号なし整数CV_8 UC 4表示:4チャネルアレイ、8 bit符号なし整数CV_32 FC 1表示:シングルチャネルアレイ、32 bit float型
2、Matに値を割り当てる:
(1). ファイルからMatに画像を読み込みます.
(2). RGBAヌードデータをMatに割り当てます.
3.Matのデータを読み取る:
(3).Matのデータを出力:
Matのデータをファイルに保存します.
1.Matオブジェクトの作成
// 1280x1024 8 4 0 Mat
cv::Mat mBGRAImg = cv::Mat::zeros(1280, 1024, CV_8UC4);
// 1280x1024 8 1 0 Mat
cv::Mat mGrayImg = cv::Mat::zeros(1280, 1024, CV_8UC1);
typeの場合、フォーマットは:CV_ビット数+数値タイプ+Cチャネル数(例:CV_8 UC 1表示:シングルチャネルアレイ、8 bit符号なし整数CV_8 UC 4表示:4チャネルアレイ、8 bit符号なし整数CV_32 FC 1表示:シングルチャネルアレイ、32 bit float型
2、Matに値を割り当てる:
(1). ファイルからMatに画像を読み込みます.
// Mat
cv::Mat image = cv::imread(file_path, cv::IMREAD_UNCHANGED);
// RGBA
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
(2). RGBAヌードデータをMatに割り当てます.
// 1280*1024 8 4 0 Mat
cv::Mat mRGBAImg = cv::Mat::zeros(1280, 1024, CV_8UC4);
// 1280*1024 8 1 0 Mat
cv::Mat mGrayImg = cv::Mat::zeros(1280, 1024, 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<:vec3b>(i, j)[0] = (mPicData[(i * width + j) * 4 + 0] & 0xFF);
mRGBAImg.at<:vec3b>(i, j)[1] = (mPicData[(i * width + j) * 4 + 1] & 0xFF);
mRGBAImg.at<:vec3b>(i, j)[2] = (mPicData[(i * width + j) * 4 + 2] & 0xFF);
mRGBAImg.at<:vec3b>(i, j)[3] = (mPicData[(i * width + j) * 4 + 3] & 0xFF);
}
}
3.Matのデータを読み取る:
(3).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(i, j), face_key_pionts.at(i + 1, j));
}
}
LOGE("FacePointTest()-->>face_key_pionts = %s
", 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);