vector轉opencv Mat(非拷貝)

沒錯,我突發奇想用vector畫了幅圖,而且只用了大約兩百個int

知識點:

  • 無論是三通道的圖像,還是單通道的圖像,在內存裏都是和數組排布一樣的一長條
  • 獲取到頭部只需要Mat.data即可,修改也是很方便
  • .data地址指向數組的頭部即可完成vector到圖像的轉化(非拷貝)

 

下面就是簡單粗暴的代碼

#include<opencv2/opencv.hpp>

int main() {

	std::vector<int>ha = {
		2335,2345,2356,2366,2434,2445,2456,2466,2534,2545,2556,2566,
		2634,2645,2656,2666,2734,2745,2756,2766,2818,2881,2918,2981,
		3018,3081,3118,3181,3218,3281,3318,3381,3418,3481,3518,3581,
		3634,3645,3656,3666,3730,3733,3734,3745,3756,3766,3829,3845,
		3856,3866,3929,3939,3956,3966,4028,4039,4127,4139,4227,4277,
		4326,4377,4425,4477,4525,4577,4624,4677,4723,4777,4822,4877,
		4921,4977,5020,5033,5067,5077,5119,5132,5167,5177,5218,5231,
		5267,5277,5317,5359,5367,5377,5418,5459,5467,5477,5519,5559,
		5567,5577,5619,5659,5667,5677,5720,5759,5767,5777,5820,5859,
		5867,5877,5921,5925,5926,5959,5967,5977,6022,6024,6026,6059,
		6067,6077,6126,6136,6149,6159,6167,6177,6226,6236,6249,6259,
		6267,6277,6326,6336,6349,6359,6366,6377,6426,6436,6449,6459,
		6466,6477,6526,6536,6549,6559,6566,6577,6626,6659,6666,6677,
		6726,6759,6766,6777,6826,6859,6866,6876,6926,6959,6966,6976,
		7026,7059,7066,7076,7126,7159,7166,7176,7226,7259,7266,7276,
		7326,7359,7366,7376,7426,7436,7465,7476,7526,7536,7564,7576,
		7626,7636,7647,7676,7726,7736,7748,7776,7848,7875,7948,7975,
		8048,8074,8149,8173,8249,8272,8349,8370,8449,8467
	};
	std::vector<uchar>data_list(10000, 255);
	for (int i = 0; i < ha.size(); i += 2) {
		for (int j = ha[i]; j < ha[i + 1]; ++j)
			data_list[j] = 0;
	}
	auto a = &data_list[0];
	//std::cout<< "數據地址"<< (void *)a<<std::endl;
	cv::Mat image(100, 100, CV_8UC1, cv::Scalar(0, 0, 0));
	image.data =  (uchar *)a;
	cv::imshow("haha", image);
	cv::waitKey();
}

還是忍不住把結果放上來了…233

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章