Fix bugs in blob detector

When passing grayscale images by value, they can't be changed inside a
function. Also, fixed an infinite loop when more than 0 but less than 3
blobs were getting detected.

Signed-off-by: Milind Upadhyay <milind.upadhyay@gmail.com>
Change-Id: I5403d02aa9e3df07800791312f0e18ee81824868
diff --git a/y2022/vision/blob_detector.cc b/y2022/vision/blob_detector.cc
index 8fc70f6..8ac96cd 100644
--- a/y2022/vision/blob_detector.cc
+++ b/y2022/vision/blob_detector.cc
@@ -200,8 +200,10 @@
 
   // If we see more than this number of blobs after filtering based on
   // color/size, the circle fit may detect noise so just return no blobs.
+  constexpr size_t kMinFilteredBlobs = 3;
   constexpr size_t kMaxFilteredBlobs = 50;
-  if (filtered_blobs.size() > 0 && filtered_blobs.size() <= kMaxFilteredBlobs) {
+  if (filtered_blobs.size() >= kMinFilteredBlobs &&
+      filtered_blobs.size() <= kMaxFilteredBlobs) {
     constexpr size_t kRansacIterations = 15;
     for (size_t i = 0; i < kRansacIterations; i++) {
       // Pick 3 random blobs and see how many fit on their circle
@@ -291,7 +293,7 @@
 }
 
 void BlobDetector::ExtractBlobs(
-    cv::Mat rgb_image, cv::Mat binarized_image, cv::Mat blob_image,
+    cv::Mat rgb_image, cv::Mat &binarized_image, cv::Mat blob_image,
     std::vector<std::vector<cv::Point>> &filtered_blobs,
     std::vector<std::vector<cv::Point>> &unfiltered_blobs,
     std::vector<BlobStats> &blob_stats, cv::Point &centroid) {