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);
}