您的位置:首页 > 其它

根据高度图计算体积等。

2017-08-02 14:36 141 查看
根据高度图计算体积等。

1、2017年8月2日14:31:18。

//计算高度图的面积(mm^2)、体积(mm^3)、平均高度(mm)。
//输入高度图:高度单位mm。
//每像素18.3um=0.0183mm。
int CalVolumeByHeightMat(const cv::Mat & HeightMat,double & dArea, double & dVolume, double & dAveHeight, double dMmPerPixel);

//计算高度图的面积(mm^2)、体积(mm^3)、平均高度(mm)。
//输入高度图:高度单位mm。
//输入掩码矩阵.
//每像素18.3um=0.0183mm。
int CalVolumeByHeightSrcMat(const cv::Mat & HeightSrcMat, const cv::Mat & MaskMat, double & dArea, double & dVolume, double & dAveHeight);

int TestCalVolumeByHeightSrcMat(const cv::Mat & HeightSrcMat, double & dArea, double & dVolume, double & dAveHeight);


int CalVolumeByHeightMat(const cv::Mat & HeightMat, double & dArea, double & dVolume, double & dAveHeight, double dMmPerPixel)
{
int nCount = countNonZero(HeightMat);
if (nCount <= 0)
{
dArea = 0;
dVolume = 0;
dAveHeight = 0;
return 1;
}
cv::Scalar vSum = sum(HeightMat);
double dTmpVolume = vSum[0];
dAveHeight = dTmpVolume / nCount;
dArea = nCount * dMmPerPixel * dMmPerPixel;
dVolume = dTmpVolume * dMmPerPixel * dMmPerPixel;
return 1;
}

int CalVolumeByHeightSrcMat(const cv::Mat & HeightSrcMat, const cv::Mat & MaskMat, double & dArea, double & dVolume, double & dAveHeight)
{
int nHeightRows = HeightSrcMat.rows;
int nHeightCols = HeightSrcMat.cols;

int nMaskRows = MaskMat.rows;
int nMaskCols = MaskMat.cols;

cv::Mat HeightMat;
if ((nHeightRows == nMaskRows) && (nHeightCols == nMaskCols))
{
HeightSrcMat.copyTo(HeightMat, MaskMat);
}
else
{
HeightSrcMat.copyTo(HeightMat);
}

//每像素18.3um=0.0183mm。
double dMmPerPixel = 0.0183;

CalVolumeByHeightMat( HeightMat, dArea, dVolume, dAveHeight, dMmPerPixel);
return 1;
}

int TestCalVolumeByHeightSrcMat(const cv::Mat & HeightSrcMat, double & dArea, double & dVolume, double & dAveHeight)
{
//cv::Mat MaskMat(HeightSrcMat.size(), CV_8UC1, cv::Scalar::all(255));
cv::Mat MaskMat(HeightSrcMat.size(), CV_8UC1, cv::Scalar::all(0));

cv::Rect ROIRect = cv::Rect(0, 0, 15,8);
cv::Mat ROIMat = MaskMat(ROIRect);
ROIMat.setTo(cv::Scalar::all(255));

CalVolumeByHeightSrcMat(HeightSrcMat, MaskMat, dArea,dVolume, dAveHeight);
return 1;
}

cv::Mat mat = cv::imread(strFileName, cv::IMREAD_GRAYSCALE);

double minVal = 0;
double maxVal = 0;
cv::minMaxLoc(mat, &minVal,&maxVal);

const int channels[1] = { 0 };
const int histSize[1] = { 256 };
float hranges[2] = { 0,256 };
const float* ranges[1] = { hranges };
cv::MatND hist;
cv::calcHist(&mat, 1, channels, cv::Mat(), hist, 1, histSize, ranges);
int nNumOf0 = hist.at<float>(0);
int nNumOfAll = mat.rows * mat.cols;
hist.at<float>(0) = 0;
cv::Scalar scalar = cv::sum(hist);
int nNumOf1 = scalar[0];

double dArea = 0;
double dVolume = 0;
double dAveHeight = 0;
TestCalVolumeByHeightSrcMat(mat, dArea, dVolume, dAveHeight);

说明:
1、根据高度图计算体积、面积、平均高度。

2、熟悉cv::Mat的部分操作。

3、熟悉直方图使用。

4、熟悉ROI使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: