opencv里的数组转矩阵

opencv中矩阵 cv::Mat 是按照(row,col)排的,也就是(height,width),但内部存储实际上还是行优先的,内部数组存储可以直接使用

//gdal读数据,width*height
float *pBuffer = new float[nWidth*nHeight];
poDataset->RasterIO(GF_Read, 0, 0, nWidth, nHeight, pBuffer, nWidth, nHeight, GDT_Float32, nBand, NULL, 1, 0, 1); 
//width*height,注意参数传入
cv::Mat src(nHeight,nWidth,CV_32FC1,pBuffer);

opencv掩膜

掩膜必须是 CV_8U 类型,即CV_8UC1 CV_8UC2 CV_8UC3 CV_8UC4,波段数opencv只有1-4,可以逐个波段处理,掩膜中1处理,0不处理

char* mask = new char[nWidth*nHeight];
//加载掩膜
cv::Mat mask((nHeight,nWidth,CV_8UC1,mask);

opencv卷积

卷积调用 cv::filter2D,src和dst矩阵可以相同,处理的矩阵可以自己设计,opencv卷积经过优化速度,比自己写的快

//加数据和掩膜
...
cv::Mat src(nHeight,nWidth,CV_32FC1,pBuffer);
cv::Mat mask((nHeight,nWidth,CV_8UC1,mask);
//拷贝,全部处理
cv::Mat filterData;
filterData = src.clone();
cv::filter2D(filterData, filterData, -1, fKM);
//将处理后的掩膜部分贴回去
filterData.copyTo(src,mask);