在射线照片中找到轮廓

时间:2017-06-02 19:49:33

标签: c++ opencv image-processing opencv-contour

我刚开始学习openCV,我想写一个可以检测射线照片中器官的程序。结果我希望看起来像 this 我试过cv2.findContours但它无法检测到正确的那个,然后我使用凸包,它返回like this,这不是我想要的那个。
还有其他方法可以在openCV中找到可以帮助我解决这个问题的轮廓吗?我只能找到两种方法。

1 个答案:

答案 0 :(得分:1)

你必须使用validContours,这样你就可以在使用findContours后使用这段代码,并更改boundRect值以找到你想要的区域

vector<vector<Point> > contours_poly(contourss.size());
                vector<Rect> boundRect(contourss.size());
                vector<Point2f>center(contourss.size());
                vector<float>radius(contourss.size());
                //Get poly contours
                for (int i = 0; i < contourss.size(); i++)
                {
                    approxPolyDP(Mat(contourss[i]), contours_poly[i], 3, true);
                }
                //Get only important contours, merge contours that are within another
                vector<vector<Point> > validContours;
                for (int i = 0; i < contours_poly.size(); i++){
                    Rect r = boundingRect(Mat(contours_poly[i]));
                    if (r.area() < 200)continue;
                    bool inside = false;
                    for (int j = 0; j < contours_poly.size(); j++){
                        if (j == i)continue;
                        Rect r2 = boundingRect(Mat(contours_poly[j]));
                        if (r2.area() < 200 || r2.area()<r.area())continue;
                        if (r.x>r2.x&&r.x + r.width<r2.x + r2.width&&
                            r.y>r2.y&&r.y + r.height < r2.y + r2.height){
                            inside = true;
                        }
                    }
                    if (inside)continue;
                    validContours.push_back(contours_poly[i]);
                }
                //Get bounding rects
                for (int i = 0; i < validContours.size(); i++){
                    boundRect[i] = boundingRect(Mat(validContours[i]));
                }