opencv加載內存中圖片

        opencv從磁盤加載一張圖片非常簡單,通過cv::imread即可,代碼如下:

	cv::Mat src_mat = cv::imread("1.jpg"); //讀取圖片1.jpg,imread會將圖片內容解碼成yuv或rgb存放到Mat對象
	cv::Mat dst_mat = src_mat(cv::Rect(100, 100, 1600, 900)); //獲取圖片固定區域的內容
	std::vector<uchar> jpg_buff;
	bool ret = cv::imencode(".jpg", dst_mat, jpg_buff);//對固定區域的內容重新進行jpg編碼,生成jpg圖片,存入jpg_buff
	FILE *file = fopen("2.jpg", "wb");
	if (file != nullptr) {
		fwrite(jpg_buff.data(), 1, jpg_buff.size(), file); //將jpg圖片寫入內存
		fclose(file);
	}

        然而,很多情況,程序需要從內存中加載圖片,例如通過網絡上傳的圖片。很顯然,這樣的圖片不能寫入磁盤,然後再通過cv::imread讀取,效率太低了。因此,需要從內存直接加載。然後通過cv::imdecode將圖片解碼成cv::Mat,代碼如下:

	FILE *file = fopen("1.jpg", "rb");
	uchar *mem_pic = nullptr;
	long size = 0;
	if (file != nullptr) {
		fseek(file, 0, SEEK_END);
		size = ftell(file);
		fseek(file, 0, SEEK_SET);
		mem_pic = new uchar[size];
		fread(mem_pic, 1, size, file);
		fclose(file);
	}

	cv::_InputArray pic_arr(mem_pic, size);
	cv::Mat src_mat = cv::imdecode(pic_arr, CV_LOAD_IMAGE_COLOR);
	cv::Mat dst_src = src_mat(cv::Rect(100, 100, 1600, 900));
	std::vector<uchar> pic_buff;
	bool ret = cv::imencode(".jpg", dst_src, pic_buff);
	file = fopen("3.jpg", "wb");
	if (file != nullptr) {
		fwrite(pic_buff.data(), 1, pic_buff.size(), file);
		fclose(file);
	}

        cv::_Array還可以使用std::vector代替,代碼如下:

	FILE *file = fopen("1.jpg", "rb");
	uchar *mem_pic = nullptr;
	long size = 0;
	if (file != nullptr) {
		fseek(file, 0, SEEK_END);
		size = ftell(file);
		fseek(file, 0, SEEK_SET);
		mem_pic = new uchar[size];
		fread(mem_pic, 1, size, file);
		fclose(file);
	}

	//cv::_InputArray pic_arr(mem_pic, size);
	std::vector<uchar> pic_vec(mem_pic, mem_pic + size);
	cv::Mat src_mat = cv::imdecode(pic_vec, CV_LOAD_IMAGE_COLOR);
	cv::Mat dst_src = src_mat(cv::Rect(200, 200, 400, 225));
	std::vector<uchar> pic_buff;
	bool ret = cv::imencode(".jpg", dst_src, pic_buff);
	file = fopen("3.jpg", "wb");
	if (file != nullptr) {
		fwrite(pic_buff.data(), 1, pic_buff.size(), file);
		fclose(file);
	}

 

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