C/C++

C/C++: opencv 的 Mat type 與 c++ 的 vector type 互轉

最近我在公司學習的VC程式中,都是宣告vetor來儲存資料,為了可以使用影像資料,因此在VC程式中導入了opencv library來讀取圖片檔。不過opencv的圖片都是宣告在Mat格式中,而原本程式是使用vector來輸入資料,因此需要將記憶體中的像素值,轉存成vector格式。

目前已經實現灰階影像互轉功能,還沒有測試RGB三通道的狀況,但是雛型是有先寫出來了。

vector convert to Mat

int channels = 1;
int rows = 96;
int cols = 96;
Mat M(rows, cols, CV_32FC1);
std::vector< std::vector< std::vector<float> > > data;

// make a "vector" type
for (int d = 0; d < channels; d++) {
    std::vector< std::vector<float> > tmp_rows;
    for (int r = 0; r < rows; r++) {
        std::vector<float> tmp_cols;
        for (int c = 0; c < cols; c++) {
            float tmp = img.at<uchar>(r, c);
            tmp_cols.push_back(tmp);
        }
        tmp_rows.push_back(tmp_cols);
    }
    img_data.push_back(tmp_rows);
}

// convert to "Mat" type
for (size_t i = 0; i < data.size(); ++i) {
    for (size_t j = 0; j < data[0].size(); ++j) {
        for (size_t k = 0; k < data[0][0].size(); ++k) {
            M.at<float>(j,k) = data[i][j][k];
        }
    }
}

Mat convert to vector

std::vector< std::vector< std::vector<float> > > img_data;

// read a image to "Mat" type
Mat img = cv::imread("gray_image.png", CV_8UC1);
if (img.empty()) return -1;

// convert to "vector" type
for (int d = 0; d < img.channels(); d++) {
    std::vector< std::vector<float> > tmp_rows;
    for (int r = 0; r < img.rows; r++) {
        std::vector<float> tmp_cols;
        for (int c = 0; c < img.cols; c++) {
            float tmp = img.at<uchar>(r, c);
            tmp_cols.push_back(tmp);
        }
        tmp_rows.push_back(tmp_cols);
    }
    img_data.push_back(tmp_rows);
}

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *