本文共 2748 字,大约阅读时间需要 9 分钟。
根据高度图计算体积等。
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(0); int nNumOfAll = mat.rows * mat.cols; hist.at (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使用。
转载地址:http://yswci.baihongyu.com/