昨天用realsense试了试乒乓球,效果还不错,但是由于应用的限制,用不了颜色这么鲜艳的标记点,于是今天3d打印了一个深咖啡色(深棕色)的小球,试了试,效果也不错:
rgb处理的流程变成了:
- RGB转灰度
- 二值化
- 连通域滤波
- 按照连通域大小
- 按照连通域的圆度:圆度计算公式
roundness = 面积*4*pi / (周长)^2
, 约大约圆。
Mat imgGray;
cvtColor(image, imgGray, CV_BGR2GRAY);
// threshold
Mat imgBin;
inRange(imgGray, Scalar(0), Scalar(90), imgBin);
// find all connected components
vector<vector<Point>>contours;
vector<Vec4i>hierarchy;
findContours(imgBin, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
Mat imgTarget = Mat::zeros(imgBin.size(), CV_8U);
for (int i=0; i<contours.size();i++)
{
// calculate area
double a = contourArea(contours[i]);
// calculate roundness
double factor = (a * 4 * CV_PI) / (pow(arcLength(contours[i], true), 2));
// draw out contours fit the need
if (a < 150 && a > 80 && factor > 0.8)
drawContours(imgTarget, contours, i, Scalar(255), CV_FILLED, 8, hierarchy);
}