所以我想分割并提取图像中的硬币,并将其用于其他目的。但是我遇到了先提取那些硬币的问题。背景不应该一直都是白色的。
我尝试阈值化并找到轮廓,但是它返回的轮廓比预期的多。我该怎么办?
cv:: Mat coinpic,backgroundpic,diffpic,newpic,threshold;
cv::cvtColor([self cvMatFromUIImage:coins], coinpic, cv::COLOR_BGR2GRAY);
cv::threshold(coinpic, diffpic, 200, 255, cv::THRESH_BINARY_INV+cv::THRESH_OTSU);
vector<vector<cv::Point>>contours;
vector<cv::Vec4i>hierarchy;
cv::findContours(diffpic, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
cout<<contours.size()<<endl;
return [self UIImageFromCVMat:diffpic];
我期望的结果类似于以下链接:https://docs.opencv.org/3.4.3/d3/db4/tutorial_py_watershed.html
答案 0 :(得分:1)
硬币检测是典型的示例,您(很可能)要对圆使用霍夫变换。它在OpenCV中实现,您可以找到几个示例,例如here和here(它们在Python中,但您可以找到许多其他示例)
您可能会在第一次尝试时获得更多(或不是全部)轮廓,要解决此问题,您应该使用param1和param2(请参见opencv documentation)