c++ - 我怎样才能从OpenCV的凸缺陷点画出最小的圆

标签 c++ macos opencv

我一直在使用 OpenCV 进行手部识别,我得到了这段代码,可以找到轮廓、凸包和一些缺陷点。但是我现在无法从缺陷点绘制最小的圆(只是轮廓)。我想知道如何使用缺陷点等特定点来绘制圆形轮廓。顺便说一句,我正在使用 XCode 5.1,抱歉我的英语不好。谢谢!

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cvaux.h>

using namespace cv;
using namespace std;


Mat image, gray_image, blur_image, binary_image;
int thresh = 90;

int main( int argc, char** argv){
    namedWindow("Window", CV_WINDOW_AUTOSIZE);
    image = imread("/Users/Jamesbond/Desktop/hand.png");
    cvtColor(image, gray_image, CV_BGR2GRAY);
    medianBlur(gray_image, blur_image, 11);
    Canny(blur_image, binary_image, 90, 180, 3);

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(binary_image, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0));

    if(contours.size()>0){
        vector<vector<int>>hull(contours.size());
        vector<vector<Vec4i>>convDef(contours.size());
        vector<vector<Point>>hull_points(contours.size());
        vector<vector<Point>> defect_points(contours.size());

        for( int i = 0; i < contours.size(); i++ )
        {
            convexHull( contours[i], hull[i], false );
            convexityDefects( contours[i],hull[i], convDef[i]);

            for(int k=0;k<hull[i].size();k++)
            {
                int ind=hull[i][k];
                hull_points[i].push_back(contours[i][ind]);
            }

            for(int k=0;k<convDef[i].size();k++)
            {
                int ind = convDef[i][k][2];
                defect_points[i].push_back(contours[i][ind]);
                circle(image,contours[i][ind],5,Scalar(255,0,0),-1);

                drawContours( image, contours, i, Scalar(255,0,255), 2, 8, vector<Vec4i>(), 0, Point());
                drawContours( image, hull_points, i, Scalar(255,255,0), 2, 8, vector<Vec4i>(), 0, Point());
            }
        }

        imshow("Window", image);
        waitKey(0);
    }
}

最佳答案

没有测试过,但应该是这样的:

        // collect the defects:
        //
        for(int k=0;k<convDef[i].size();k++)
        {
            int ind = convDef[i][k][2];
            defect_points[i].push_back(contours[i][ind]);
            circle(image,contours[i][ind],5,Scalar(255,0,0),-1);
            drawContours( image, contours, i, Scalar(255,0,255), 2, 8, vector<Vec4i>(), 0, Point());
            drawContours( image, hull_points, i, Scalar(255,255,0), 2, 8, vector<Vec4i>(), 0, Point());
        }

        // draw smallest circle around defects:
        //
        Point center;
        float radius;
        minEnclosingCircle( defect_points, center, radius );
        circle(image,center,radius,Scalar(255,0,0),3);

关于c++ - 我怎样才能从OpenCV的凸缺陷点画出最小的圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23948272/

相关文章:

xcode - 在界面生成器中拖动 Canvas

linux - 从脚本运行远程命令

cocoa - CoreService 框架有关于 PBFSCopyFileSync 的详细文档或示例代码吗?

opencv - 在文本行之间添加白线

c++如何在运行时链接函数声明?

c++ - QT:无法从另一个线程启用套接字通知程序

c++ - 如何在 C++ 中正确使用 ostringstream?

c++ - 为什么包含守卫不阻止多个函数定义?

matlab - 使用 OpenCV 和 Matlab 的校准图像和三角网格的深度图

c++ - 顺时针旋转二维矩阵会产生奇数结果