OpenCV Mat詳細

2802 ワード

MatはOpenCVストレージオブジェクトユニットで、一般的にデータを格納または変換する際に使用する必要があります.
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);