我正在使用cv::minEnclosingCircle(...)
以获得确切演变轮廓的最小圆圈,但我得到的圆圈要大一点。
换句话说,我正试图得到这样的东西:
但我得到了这个(圆圈):
请注意圆圈是否比要封闭的项目大一点。
我需要将我的物体包围成圆形,而不是椭圆形。
提前谢谢。
这是我的代码:
cv::vector<cv::Point> allPixels;
int columnas = img.cols, filas = img.rows;
cv::Point pt;
for(int col = 0; col < columnas; col++){
for(int row = 0; row < filas; row++){
int val = img.at<uchar>(row,col);
if(val == 255){
pt.x = col;
pt.y = row;
allPixels.push_back(pt);
}
}
}
cv::Mat dispImage = img.clone();
cv::Point2f center;
float radius;
cv::minEnclosingCircle(allPixels,center,radius);
cv::circle(dispImage,center,radius,cv::Scalar(128),1);
cv::circle(dispImage,center,1,cv::Scalar(128),1);
cv::imwrite("Enclosing_Result.png",dispImage);
使用'img'一个cv :: Mat大小(760,760)和格式CV_8UC1。最后的结果(“Enclosing_Result.png”)是下一个:
我的目标如下(绘制):
答案 0 :(得分:1)
我的结果还可以。
## only one region
cnts = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
(x,y), r = cv2.minEnclosingCircle(cnts[0])
## more than one region
mask = threshed.copy()
## find centers
for cnt in cnts:
(x,y), r = cv2.minEnclosingCircle(cnt)
pt = (int(x), int(y))
centers.append(pt)
## connect the `centers`
for i in range(1, len(centers)):
cv2.line(mask, centers[i-1], centers[i], 255, 2)
## find the center
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
(x,y), r = cv2.minEnclosingCircle(cnts[0])