Image 如何发现检测到的斑点/对象重叠,以及如何将其分组?
如何发现检测到的斑点/对象重叠,以及如何将其分组? 例如,我有标记的blob坐标 **检测到的斑点数-5** 我的Blob坐标如下:Image 如何发现检测到的斑点/对象重叠,以及如何将其分组?,image,opencv,image-processing,rectangles,overlapping,Image,Opencv,Image Processing,Rectangles,Overlapping,如何发现检测到的斑点/对象重叠,以及如何将其分组? 例如,我有标记的blob坐标 **检测到的斑点数-5** 我的Blob坐标如下: bool valueInRange(int value, int min, int max) { return (value >= min) && (value <= max); } bool RectOverlap(Rect A, Rect B) { bool xOverlap = valueInRange(
bool valueInRange(int value, int min, int max)
{ return (value >= min) && (value <= max); }
bool RectOverlap(Rect A, Rect B)
{
bool xOverlap = valueInRange(A.x, B.x, B.x + B.width) ||
valueInRange(B.x, A.x, A.x + A.width);
bool yOverlap = valueInRange(A.y, B.y, B.y + B.height) ||
valueInRange(B.y, A.y, A.y + A.height);
return xOverlap && yOverlap;
}
起始X、起始Y-水滴宽度-水滴高度
100 100 100 100
125 125 80 90
80 80 70 50
130 130 10 10
10 10 5 8
--如何找到重叠的对象/矩形?
--如何分组
**我们的结果应该是****
**检测到2个水滴-2**
80 80 205 210
10 10 5 8
如何实现这一点???如果我理解正确,您的blob可以被视为
cv::Rect(StartingX、StartingY、BlobWidth、BlobHeight)
在opencvc++
中,检查这样的矩形重叠是否容易:rectA&rectB=rectcoverlap
其中rectcoverlap是两个矩形覆盖的矩形区域,因此如果rectcoverlap具有.width>0
和c.height>0
,则斑点/矩形重叠
下面是创建一些矩形并计算它们是否重叠的示例代码:
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);
}
intmain()
{
cv::Mat样本=cv::Mat(512512,cv_8UC3,cv::Scalar(0,0,0));
//创建示例矩形:位置X、位置Y、宽度、高度
cv::Rect rectA(100,50,50200);
cv::Rect rectB(50100200,50);
cv::Rect rectC(400,50100100);
//用不同的颜色绘制:
cv::矩形(样本,矩形,cv::标量(0,0255));
cv::rectangle(示例,rectB,cv::Scalar(255,0,0));
cv::矩形(样本,rectC,cv::标量(0255,0));
//创建输出
cv::Mat结果=cv::Mat(512512,cv_8UC3,cv::Scalar(0,0,0));
//对cv::Rect使用重载的&运算符计算重叠
cv::Rect overlaab=rectA&rectB;
cv::Rect overlaac=rectA&rectC;
//测试重叠和拉伸或端子输出
if(overlapAB.width和&overlapAB.height)cv::rectangle(result,overlapAB,cv::Scalar(255,0255),-1);
else std::cout如果我理解正确,您的blob可以被视为cv::Rect(StartingX、StartingY、BlobWidth、BlobHeight)
在opencvc++
中,检查这样的矩形重叠是否容易:rectA&rectB=rectcoverlap
其中rectcoverlap是两个矩形覆盖的矩形区域,因此如果rectcoverlap具有.width>0
和c.height>0
,则斑点/矩形重叠
下面是创建一些矩形并计算它们是否重叠的示例代码:
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);
}
intmain()
{
cv::Mat样本=cv::Mat(512512,cv_8UC3,cv::Scalar(0,0,0));
//创建示例矩形:位置X、位置Y、宽度、高度
cv::Rect rectA(100,50,50200);
cv::Rect rectB(50100200,50);
cv::Rect rectC(400,50100100);
//用不同的颜色绘制:
cv::矩形(样本,矩形,cv::标量(0,0255));
cv::rectangle(示例,rectB,cv::Scalar(255,0,0));
cv::矩形(样本,rectC,cv::标量(0255,0));
//创建输出
cv::Mat结果=cv::Mat(512512,cv_8UC3,cv::Scalar(0,0,0));
//对cv::Rect使用重载的&运算符计算重叠
cv::Rect overlaab=rectA&rectB;
cv::Rect overlaac=rectA&rectC;
//测试重叠和拉伸或端子输出
if(overlapAB.width和&overlapAB.height)cv::rectangle(result,overlapAB,cv::Scalar(255,0255),-1);
else std::cout与类似,您可以按如下方式检查两个矩形是否重叠:
bool valueInRange(int value, int min, int max)
{ return (value >= min) && (value <= max); }
bool RectOverlap(Rect A, Rect B)
{
bool xOverlap = valueInRange(A.x, B.x, B.x + B.width) ||
valueInRange(B.x, A.x, A.x + A.width);
bool yOverlap = valueInRange(A.y, B.y, B.y + B.height) ||
valueInRange(B.y, A.y, A.y + A.height);
return xOverlap && yOverlap;
}
在此之后,您应该将所有覆盖的矩形组合并为大矩形(一组对一)以获得最终结果。类似于,您可以检查两个矩形是否重叠,如下所示:
bool valueInRange(int value, int min, int max)
{ return (value >= min) && (value <= max); }
bool RectOverlap(Rect A, Rect B)
{
bool xOverlap = valueInRange(A.x, B.x, B.x + B.width) ||
valueInRange(B.x, A.x, A.x + A.width);
bool yOverlap = valueInRange(A.y, B.y, B.y + B.height) ||
valueInRange(B.y, A.y, A.y + A.height);
return xOverlap && yOverlap;
}
在此之后,您应该将所有覆盖的矩形组合并为大矩形(一组对一)以获得最终结果。第一组应为80 80 205 215
,对吗?是的,第一组由四个矩形组成是80 80 205 210
是应该查找和分组的第一个矩形。第一个组应该是80 80 80 205 215
,对吗?是第一个组由四个矩形组成是的,8080205210
是应该查找和分组的第一个矩形。请详细解释。rectA&rectB=rectC
**这里发生了什么**我不明白。请详细解释。rectA&rectB=rectC
**这里发生了什么**我不明白。