Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何发现检测到的斑点/对象重叠,以及如何将其分组?_Image_Opencv_Image Processing_Rectangles_Overlapping - Fatal编程技术网

Image 如何发现检测到的斑点/对象重叠,以及如何将其分组?

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(

如何发现检测到的斑点/对象重叠,以及如何将其分组? 例如,我有标记的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(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)

在opencv
c++
中,检查这样的矩形重叠是否容易:
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)

在opencv
c++
中,检查这样的矩形重叠是否容易:
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 &gt;= min) && (value &lt;= 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 &gt;= min) && (value &lt;= 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
**这里发生了什么**我不明白。