如何找到检测到的 Blob /对象重叠以及如何将其分组? 例如,我有标记的 blob 坐标。
** 检测到的 BLOBS 数量 - 5 ** 我的 Blob 坐标如下:
起始 X ,起始 Y - Blob 宽度 - Blob 高度
100 100 100 100
125 125 80 90
80 80 70 50
130 130 10 10
10 10 5 8
-- 如何找到重叠的对象/矩形? -- 如何分组?
** 我们的结果应该是 **** **检测到 2 个 Blob - 2 **
80 80 205 210
10 10 5 8
如何实现??
最佳答案
如果我没理解错的话,你的 blob 可以被视为 cv::Rect(StartingX,StartingY, BlobWidth, BlobHeight)
在 opencv c++
中,检查这样的 Rect 是否重叠很容易:rectA & rectB = rectOverlap
其中 rectOverlap 是两个 rect 覆盖的 rect 区域,所以如果 rectOverlap 有 .width > 0
和 c.height > 0
然后 blob/rects 重叠。
这里是创建一些矩形并计算它们是否重叠的示例代码:
int main()
{
cv::Mat sample = cv::Mat(512,512,CV_8UC3, cv::Scalar(0,0,0));
// create sample rectangles: positionsX, positionY, width, height
cv::Rect rectA(100,50,50,200);
cv::Rect rectB(50,100,200,50);
cv::Rect rectC(400,50,100,100);
// draw in different colors:
cv::rectangle(sample, rectA, cv::Scalar(0,0,255));
cv::rectangle(sample, rectB, cv::Scalar(255,0,0));
cv::rectangle(sample, rectC, cv::Scalar(0,255,0));
// create output
cv::Mat result = cv::Mat(512,512,CV_8UC3, cv::Scalar(0,0,0));
// compute overlap with overloaded & operator for cv::Rect
cv::Rect overlapAB = rectA & rectB;
cv::Rect overlapAC = rectA & rectC;
// test for overlap and draw or terminal output
if(overlapAB.width && overlapAB.height) cv::rectangle(result, overlapAB, cv::Scalar(255,0,255), -1);
else std::cout << " no overlap between rectA and rectB" << std::endl;
if(overlapAC.width && overlapAC.height) cv::rectangle(result, overlapAC, cv::Scalar(0,255,255), -1);
else std::cout << " no overlap between rectA and rectC" << std::endl;
cv::imshow("rects", sample);
cv::imshow("overlap", result);
cv::imwrite("RectOverlapInput.png", sample);
cv::imwrite("RectOverlapOutput.png", result);
cv::waitKey(-1);
}
这里是输入和输出。你可以看到检测到的蓝色和红色矩形的重叠是粉红色矩形。
输入:
输出:rectA 和 rectC 之间没有重叠
和这张图片:
关于image - 如何找到检测到的 Blob /对象重叠以及如何将其分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23365948/