簡體   English   中英

OpenCV查找閉合對象的輪廓

[英]OpenCV find contours of close objects

我正在使用OpenCV庫編寫C ++應用程序以檢測圖像中的對象。 這些圖像如下所示: http : //fs1.directupload.net/images/150311/my6uczfn.png圖像的上部為黑色,可以忽略。

我知道,每個像素(不是所需對象的一部分)都會被塗成白色。 我正在嘗試做的是找出圖像上有多少感興趣的對象以及它們在哪里。 到目前為止,我編寫了以下代碼:

Mat image = imread("2.png", CV_LOAD_IMAGE_COLOR);
if(!image.data)
{
  std::cout << "Could not open or find the image." << std::endl;
}

Range range_rows(0, image.size().height);
Range range_columns_left(0, image.size().width);
Range range_columns_middle(image.size().width, image.size().width * 2);
Range range_columns_right(image.size().width * 2, image.size().width * 3);
Mat display_mat(image.size().height, image.size().width * 3, CV_8UC3);
Mat left(display_mat, range_rows, range_columns_left);
image.copyTo(left);

Mat classified_image;
threshold(image, classified_image, 254, 255, THRESH_BINARY);
Mat middle(display_mat, range_rows, range_columns_middle);
classified_image.copyTo(middle);

Mat cimage = Mat::zeros(image.size(), CV_8UC3);

Mat classified_grayscale_image;
cvtColor(classified_image, classified_grayscale_image, CV_RGB2GRAY); 
std::vector< std::vector<cv::Point> > contours;
findContours(classified_grayscale_image, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);

for(size_t counter = 0; counter < contours.size(); counter++)
{
  std::cout << "Contours size: " << contours[counter].size() << std::endl;
  if(contours[counter].size() < 6)
    continue;

  Mat pointsf;
  Mat(contours[counter]).convertTo(pointsf, CV_32F);
  RotatedRect box = fitEllipse(pointsf);

  drawContours(cimage, contours, (int)counter, Scalar::all(255), 1, 8);
  ellipse(cimage, box, Scalar(0,0,255), 1, CV_AA);
  std::cout << "Ellipse Parameter:\t";
  ellipse(cimage, box.center, box.size*0.5f, box.angle, 0, 360, Scalar(0,255,255), 1, CV_AA);
  Point2f vtx[4];
  box.points(vtx);
  for( int j = 0; j < 4; j++ )
      line(cimage, vtx[j], vtx[(j+1)%4], Scalar(0,255,0), 1, CV_AA);
}

Mat right(display_mat, range_rows, range_columns_right);
cimage.copyTo(right);

namedWindow("Results", CV_WINDOW_AUTOSIZE);
imshow("Results", display_mat);

waitKey(0);

return 0;

結果看起來像這樣: http : //fs1.directupload.net/images/150311/toiy3aes.png

如您所見,分類(什么是對象和什么不是對象)並不完美,因此將2個對象識別為一個。 分類將得到改善,但是如果這些對象非常接近,則可能會發生這種情況。 當他們彼此接觸時,更大的問題是。 在上述情況下,如何正確識別物體? 有任何想法嗎?

您有幾種選擇:

  • 在結果圖像上使用某種過濾/閾值方法將對象彼此分離。 在這種情況下,Otsu二值化就足夠了,或者您可以嘗試使用擴張操作。
  • 反轉您的結果圖像,然后使用距離變換和Otsu二值化(或其他某種閾值化方法-大多數應該可以正常工作)。 它將使您的物體變小,但使計數變得容易得多。
  • 如果需要盡可能精確地標記對象,則需要使用更復雜的方法。 這里有一個教程,它使用了我上面描述的技術以及連接的組件和分水嶺。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM