Opencv raw形式の画像を開く

2217 ワード

c++opencvでrawリモートセンシング画像を表示し、一日模索して記録しましょう.とにかくfopenで開き、memcpyでメモリをコピーします.元の画像の解像度、データのタイプに注意してください.
 

/***********************************************************
  raw  ,  opencv   。             (8221*7441);
       float,  fopen memcpy       opencv    !!!
@zhou 2020/1/8
************************************************************/
#include
#include
using namespace std;
using namespace cv;
int main()
{
	int height = 7441;//      
	int width = 8221;//      
	/*int height = 7441;
	int width = 8221;*/
	FILE *fp = NULL; //    
	fp = fopen("1.raw", "rb+");
	float *data = (float *)malloc(width*height * sizeof(float)); //    ,new,malloc  
	fread(data, sizeof(float), width*height, fp); //        
	cv::Mat img;
	int bufLen = width*height;  //    
	img.create(height, width, CV_32FC1);//  Mat
	memcpy(img.data, data, bufLen * sizeof(float)); //    
	/*
	//          
	for (int row = 0; row < img.rows; row++)
		{
			for (int col = 0; col < img.cols; col++)
				{
					int d = img.at(row, col);
					printf("%d,%d,   :%d
", row, col, d); } } */ // (3678,535) int pixel = img.at(3678, 635); printf("%d,%d, :%d
", 3678, 635, pixel); //normalize(img,img, 1.0,255.0, NORM_INF); double minv = 0.0, maxv = 0.0; double* minp = &minv; double* maxp = &maxv; minMaxIdx(img, minp, maxp);// cout << " :" << *minp << endl; cout << " :" << *maxp << endl; //img.convertTo(img, CV_8UC1, 255, 0); // 0,255 namedWindow("img", 0);// imshow("img", img); // //imwrite("out.jpg", img); // jpg waitKey(0); return 0; }

 
実行結果は次のとおりです.
 
pythonバージョンを補足しnumpyで開くのは便利で、コードは以下の通りです.
"""
python   raw     
@zhou 2020/1/8
"""
import numpy as np
import cv2
img = np.fromfile('1.raw',dtype=np.float32)
img=img.reshape((7441,8221))
cv2.namedWindow("zhou",0)
cv2.imshow("zhou",img)
cv2.waitKey(0)

同じ結果は次のとおりです.
 
まとめ:Pythonを使っていると香りがしますが、ハハハハ!!!