1. 程式人生 > >C++ vector 實現動態大小的二維陣列

C++ vector 實現動態大小的二維陣列

      為什麼會寫這個文章呢?是因為最近做一個opencv相關的專案,涉及到儲存畫素座標,但是我並不知道畫素的數量,所以想建立一個二維陣列來動態儲存畫素的x,y座標。由書上的知識可知,C++中的二維陣列實質上是一維數組裡儲存的元素仍然是一維陣列,而且在定義的時候必須指定陣列的大小,很顯然無法滿足我們的需要。

      經過查詢網上的資料,發現還有一種方法是利用new運算子建立動態陣列,但是並不好用。所以,嘗試使用二維vector類模板。如下是我的程式碼,做個記錄,以便日後檢視。

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <fstream>
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;


int main(int argc, _TCHAR* argv[])
{
	//讀入圖片,注意圖片路徑
	Mat src_image = imread("0_corrected_foreground.png", 1);
	int rows = src_image.rows;//表示影象畫素的行數,對應於影象座標的y軸
	int cols = src_image.cols;//表示影象畫素的列數,對應於影象座標的x軸
	vector<int> vec10;//用於存放i = rows座標
	vector<int> vec11;//用於存放j < cols座標
	vector<vector<int>> vec2;

	//圖片讀入成功與否判定
	if (!src_image.data)
	{
		cout << "The image reading process is wrong!" << endl;
		//等待按鍵
		system("pause");
		return -1;
	}
	imshow("原始影象", src_image);
	ofstream savefile("results.txt",ios::out);//新建一個txt檔案
	for (int i = 0; i < rows; i++)//雙層迴圈,遍歷影象的畫素點
	{
		for (int j = 0; j < cols; j++)
		{
			int bin_val = src_image.at<uchar>(i, j);
			if (bin_val==255)//判斷,如果此畫素的灰度值是255,即白色的,儲存對應的座標。
			{
				savefile << i << ", " << j << endl;//儲存到txt檔案中
				vec10.push_back(i);//push_back賦值
				vec11.push_back(j);//push_back賦值
				
			}
		}
	}
	vec2.push_back(vec10);//將一維vector推入二維vector
	vec2.push_back(vec11);//將一維vector推入二維vector
	savefile.close();//txt檔案關閉,儲存
	waitKey();
	return 0;
}

https://blog.csdn.net/liyuqian199695/article/details/63680514?locationNum=14

https://blog.csdn.net/abc8730866/article/details/62236040

https://blog.csdn.net/qq_20823641/article/details/51932798

https://blog.csdn.net/a819825294/article/details/52088732