是否有一种快速的解决方案来仅在我插入的斑点的轮廓内指定ROI?

到目前为止,我的想法是:

  • 使用boundingRect,但其中包含太多我不想分析的内容。
  • 将goodFeaturesToTrack应用于整个图像,然后遍历输出坐标,以消除blob轮廓之外的一次

  • 提前致谢!

    编辑

    我找到了我需要的东西:cv::pointPolygonTest()似乎是正确的事情,但是我不确定如何实现它……

    这是一些代码:
    // ...
    IplImage forground_ipl = result;
    IplImage *labelImg = cvCreateImage(forground.size(), IPL_DEPTH_LABEL, 1);
    
    CvBlobs blobs;
    bool found = cvb::cvLabel(&forground_ipl, labelImg, blobs);
    IplImage *imgOut = cvCreateImage(cvGetSize(&forground_ipl), IPL_DEPTH_8U, 3);
    
    if (found) {
        vb::CvBlob *greaterBlob = blobs[cvb::cvGreaterBlob(blobs)];
        cvb::cvRenderBlob(labelImg, greaterBlob, &forground_ipl, imgOut);
        CvContourPolygon *polygon = cvConvertChainCodesToPolygon(&greaterBlob->contour);
    }
    

    “多边形”包含我需要的轮廓。

    goodFeaturesToTrack通过以下方式实现:
    - (std::vector<cv::Point2f>)pointsFromGoodFeaturesToTrack:(cv::Mat &)_image
    {
        std::vector<cv::Point2f> corners;
        cv::goodFeaturesToTrack(_image,corners, 100, 0.01, 10);
        return corners;
    }
    

    因此,接下来我需要遍历角落并使用cv::pointPolygonTest()检查每个点,对吗?

    最佳答案

    您可以在您感兴趣的区域上创建蒙版:

    编辑
    如何制作口罩:

    做一个面具;

    Mat mask(origImg.size(), CV_8UC1);
    mask.setTo(Scalar::all(0));
    // here I assume your contour is extracted with findContours,
    // and is stored in a vector<vector<Point>>
    // and that you know which contour is the blob
    // if it's not the case, use fillPoly instead of drawContour();
    Scalar color(255,255,255); // white. actually, it's monchannel.
    drawContours(mask, contours, contourIdx, color );
    
    // fillPoly(Mat& img, const Point** pts, const int* npts,
    //         int ncontours, const Scalar& color)
    

    现在,您可以使用它了。 但是,请仔细查看结果-我听说过OpenCV中有关特征提取器的mask参数的一些错误,但我不确定是否与此相关。
    // note the mask parameter:
    
    void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners,
        double qualityLevel, double minDistance,
        InputArray mask=noArray(), int blockSize=3,
        bool useHarrisDetector=false, double k=0.04 )
    

    这也将提高您的复制速度-goodFeaturesToTrack会花费大量时间,如果仅将其应用于较小的图像,则总体增益将非常可观。

    10-08 16:33