Guest User

Untitled

a guest
Nov 14th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. +(UIImage *) androidWatershedTest:(UIImage *)FinalOriginalBmp:(UIImage *)orgoriginalBmp
  2. {
  3. cv::Mat extractedImage;//(orgoriginalBmp.size.width, orgoriginalBmp.size.height, CV_8UC1);
  4. UIImageToMat(orgoriginalBmp, extractedImage);
  5.  
  6. extractedImage.convertTo(extractedImage, CV_8UC4);
  7.  
  8. cv::Mat orginal(orgoriginalBmp.size.width, orgoriginalBmp.size.height, CV_8UC1);
  9. extractedImage.copyTo(orginal);
  10.  
  11. extractedImage.convertTo(extractedImage, CV_8UC1);
  12.  
  13. cv::threshold(extractedImage, extractedImage, 40, 255, cv::THRESH_OTSU);
  14.  
  15.  
  16. cv::Mat distanceTransformMat(FinalOriginalBmp.size.width, FinalOriginalBmp.size.height,CV_8UC1);
  17.  
  18. cv::distanceTransform(extractedImage, distanceTransformMat, CV_DIST_L2, 3);
  19.  
  20. cv::normalize(distanceTransformMat, distanceTransformMat, 0.0, 255, cv::NORM_MINMAX);
  21.  
  22. cv::Mat dilate(orgoriginalBmp.size.height, orgoriginalBmp.size.width, CV_8UC1, cv::Scalar(20));
  23.  
  24. distanceTransformMat.convertTo(dilate, CV_8UC1);
  25.  
  26. cv::Mat maximaGatheringMat;
  27.  
  28. dilate.copyTo(maximaGatheringMat);
  29.  
  30. std::vector<cv::Point> LocalMaximaPoints;
  31. for (int j = 0; j < maximaGatheringMat.rows; j++) {
  32. for (int k = 0; k < maximaGatheringMat.cols; k++) {
  33. cv::Vec3b pixel = maximaGatheringMat.at<cv::Vec3b>(j, k);
  34.  
  35. cv::Vec3b uppixel = maximaGatheringMat.at<cv::Vec3b>(j + 1, k);
  36. cv::Vec3b downpixel = maximaGatheringMat.at<cv::Vec3b>(j - 1, k);
  37. cv::Vec3b rightpixel = maximaGatheringMat.at<cv::Vec3b>(j, k - 1);
  38. cv::Vec3b leftpixel = maximaGatheringMat.at<cv::Vec3b>(j, k + 1);
  39. cv::Vec3b uppixelright = maximaGatheringMat.at<cv::Vec3b>(j + 1, k - 1);
  40. cv::Vec3b uppixelleft = maximaGatheringMat.at<cv::Vec3b>(j + 1, k + 1);
  41. cv::Vec3b downpixelright = maximaGatheringMat.at<cv::Vec3b>(j - 1, k - 1);
  42. cv::Vec3b downpixelleft = maximaGatheringMat.at<cv::Vec3b>(j - 1, k + 1);
  43.  
  44. if (pixel[0] > 0) {
  45.  
  46.  
  47. if (uppixel != cv::Vec3b(0,0,0)
  48. && downpixel != cv::Vec3b(0,0,0)
  49. && rightpixel != cv::Vec3b(0,0,0)
  50. && leftpixel != cv::Vec3b(0,0,0)
  51. && uppixelright != cv::Vec3b(0,0,0)
  52. && uppixelleft != cv::Vec3b(0,0,0)
  53. && downpixelright != cv::Vec3b(0,0,0)
  54. && downpixelleft != cv::Vec3b(0,0,0)) {
  55.  
  56. if (pixel[0] >= uppixel[0]
  57. && pixel[0] >= downpixel[0]
  58. && pixel[0] >= rightpixel[0]
  59. && pixel[0] >= leftpixel[0]
  60. && pixel[0] >= uppixelright[0]
  61. && pixel[0] >= uppixelleft[0]
  62. && pixel[0] >= downpixelright[0]
  63. && pixel[0] >= downpixelleft[0]) {
  64.  
  65. cv::Point point(k, j);
  66. LocalMaximaPoints.push_back(point);
  67.  
  68. }
  69.  
  70. }
  71. }
  72. }
  73. }
  74.  
  75. cv::Mat drawnMaxMAt (FinalOriginalBmp.size.width, FinalOriginalBmp.size.height, CV_8UC1, CvScalar(255));
  76.  
  77. for (int pls = 0; pls < LocalMaximaPoints.size(); pls++) {
  78.  
  79. cv::circle(drawnMaxMAt, LocalMaximaPoints[pls], 1, cv::Scalar(0, 255, 0), -1, 1, 0);
  80. }
  81.  
  82. std::vector<std::vector<cv::Point>> PointFilterMatContours;
  83. std::vector<cv::Vec4i> hierarchy1ttt;//may need to change
  84.  
  85. cv::findContours(drawnMaxMAt, PointFilterMatContours, hierarchy1ttt, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
  86.  
  87. cv::Mat PointFilterMat (drawnMaxMAt.size(), CV_8UC1, CvScalar(0));
  88.  
  89. std::vector<cv::Moments> mu(PointFilterMatContours.size());
  90. std::vector<cv::Point> FilteredPoints(PointFilterMatContours.size());
  91.  
  92. for (int i = 0; i < PointFilterMatContours.size(); i++) {
  93. mu.push_back(cv::moments(PointFilterMatContours[i], false));
  94. FilteredPoints.push_back(cv::Point(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00));
  95.  
  96. cv::circle(PointFilterMat, FilteredPoints[i], 1, CvScalar(255, 255, 255), -1, 2, 0);
  97. }
  98.  
  99. std::vector<std::vector<cv::Point>> FinalContourForWaterShed;
  100. std::vector<cv::Vec4i> hierarchyForWatershed;//may need to change
  101.  
  102. cv::findContours(PointFilterMat, FinalContourForWaterShed, hierarchyForWatershed, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
  103.  
  104. cv::Mat gray81 = cv::Mat::zeros(PointFilterMat.size(), CV_32SC1);
  105.  
  106. std::vector<cv::Moments> muForWatershed(PointFilterMatContours.size());
  107. std::vector<cv::Point> FilteredPointsforWaterShed(PointFilterMatContours.size());
  108.  
  109. for (int i = 0; i < FinalContourForWaterShed.size(); i++) {
  110. muForWatershed.push_back(cv::moments(FinalContourForWaterShed[i], false));
  111. FilteredPointsforWaterShed.push_back(cv::Point(muForWatershed[i].m10 / muForWatershed[i].m00, muForWatershed[i].m01 / muForWatershed[i].m00));
  112.  
  113. cv::circle(gray81, FilteredPointsforWaterShed[i], int(0.75), cv::Scalar::all(i+1), -1);
  114.  
  115. }
  116.  
  117. orginal.convertTo(orginal, CV_8UC3);
  118.  
  119. cv::cvtColor(orginal, orginal, cv::COLOR_GRAY2RGB);
  120. std::string ty = type2str( orginal.type() );
  121. printf("Matrix: %sn", ty.c_str() );
  122.  
  123. gray81.convertTo(gray81, CV_32S);
  124.  
  125. cv::watershed(orginal, gray81);
  126.  
  127. gray81.convertTo(gray81, CV_8UC1);
  128.  
  129. UIImage *outputImg = MatToUIImage(gray81);
  130.  
  131. return outputImg;
Add Comment
Please, Sign In to add comment