在信息有限的情况下找到质心的边界框

问题描述 投票:0回答:1

我在 opencv c++ 中检测到了 blob 关键点。质心显示良好。如果我只有斑点中心坐标,如何在检测到的斑点周围绘制边界框?由于太多的未知数,我无法从中心向后工作(或者我相信)。

        threshold(imageUndistorted, binary_image, 30, 255, THRESH_BINARY);
        Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params); 
        // Detect blob
        detector->detect(binary_image, binary_keypoints);
        drawKeypoints(binary_image, binary_keypoints, bin_image_keypoints, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

//绘制BBox ?

在单个斑点周围绘制边界框时我忽略了什么?

c++ opencv object-detection bounding-box keypoint
1个回答
0
投票

我说:

由于太多的未知数,我无法从中心向后工作(或者我相信)。

如果使用 blob 大小,则信息不受限制:keypoints.size 返回相关 blob 的直径。虽然高度不对称或不平衡的目标可能会产生一些不准确的结果,但这对我来说效果很好,因为我使用了球体物体。对于不对称目标来说,Moments/ 可能是更好的方法。

keypoints.size 不应与 keypoints.size() 混淆。后者对物体的向量进行计数,在我的例子中,前者是直径。两者都使用。 使用直径,我可以毫无问题地计算其余部分:

            float TLx = (ctr_x - r);
            float TLy = (ctr_y - r);
            float BRx = (ctr_x + r);
            float Bry = (ctr_y + r);
            Point TLp(TLx-10, TLy-10); //works fine without but more visible with enhancement
            Point BRp(BRx+10, Bry+10); //same here
            std::cout << "Top Left: " << TLp << std::endl << "Right Lower:" << BRp << std::endl;
            cv::rectangle(bin_with_keypoints, TLp, BRp, cv::Scalar(0, 255, 0));
            imshow("With Green Bounding Box:", bin_with_keypoints);

TLp = 左上角点,调整 10 像素以使框变大。

BRp = 右下角

TLx、TLy 是根据斑点中心坐标以及 BRps 计算得出的。如果您要使用多个目标,建议使用轮廓方法(使用时刻)。我有 1 - 2 个 blob 需要跟踪,哪个更容易,但可以降低资源使用量。

矩形绘制功能也可以与 Rect (diameter = keypoint.size) 配合使用

Rect r(TLp, BRp, center_x + diameter/2, center_y+diamter/2) // r(TLc, BRc, width, heigth)
cv::rectangle(bin_with_keypoints, rect, cv::Scalar(0, 255, 0));
© www.soinside.com 2019 - 2024. All rights reserved.