没错,我突发奇想用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