我在 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 ?
在单个斑点周围绘制边界框时我忽略了什么?
我说:
由于太多的未知数,我无法从中心向后工作(或者我相信)。
如果使用 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));