繁体   English   中英

了解OpenCV C ++中的Rect

[英]Understanding Rect in OpenCV C++

我正在尝试标记矩形内的像素。 要标记的矩形在if-else结构中确定。 使用在if-else任一块中定义的矩形时,出现以下错误:“断言失败(0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m。 cols && 0 <= roi.height && roi.y + roi.height <= m.rows)”

这是我正在使用的代码片段:

if (faces.size() != 0){r = faces[0];}
if (eyes.size()!=0){r2 = eyes[0];}

markers(image.rows,image.cols)
if(faces.size() == 0){
    cout << "No Face found";
    rectangle_face = rectangle_old;
    rectangle_inner = rectangle_inner_old;
    rectangle_outer = rectangle_outer_old;
}
else {
    pt1.x = r.x;
    pt1.y = r.y;
    pt2.x = pt1.x + r.width;
    pt2.y = pt2.y + r.height;

    pt1_inner.x = r.x + (r.width)/3;
    pt1_inner.y = r.y + (r.height)/3;
    pt1_outer.x = pt1.x;
    pt1_outer.y = pt1.y;

    pt2_inner.x = pt2.x - (r.width)/3;
    pt2_inner.y = pt2.y - (r.height)/3;
    pt2_outer.x = pt2.x;
    pt2_outer.y = image.rows;

    rectangle_face = r; 
    rectangle_inner = Rect(pt1_inner,pt2_inner); 
    rectangle_outer = Rect(pt2_outer,pt2_outer);
}


//rectangle_inner = Rect(pt1_inner,pt2_inner); 
//rectangle_outer = Rect(pt2_outer,pt2_outer);

rectangle_old = rectangle_face;
rectangle_outer_old = rectangle_outer;
rectangle_inner_old = rectangle_inner;



// Setting all pixels to possible background first
markers.setTo(cv::GC_PR_BGD);

//It get stuck at the following two lines
cv::Mat1b fg_seed_inside_face = markers(rectangle_inner);
//Marking pixels in order. Note: Order is important here.
cv::Mat1b Prfg_seed_FaceExtended = markers(rectangle_outer);

'faces'是detectMultiScale返回的矩形的向量。 令我感到困惑的是,如果我在if-else块之外声明长方体(inner)和长方体(outer_outer)(如代码段中else条件下面的注释所示),则该代码在'if'条件的情况下可以正常工作是不正确的。 因此,基本上我应该在if-else块外声明我的rectangle_inner和rectangular_outer,这没有意义。 有解决方法吗?

在计算内部点和外部点的(x,y)坐标以构建矩形时,必须检查通过添加或减去pt1或pt2所获得的坐标,r.weight或r.height不摆脱图像。 当您的脸靠近图像边缘时,这是相当常见的情况。

通过执行类似的操作可以轻松完成

pt1.x = r.x;
pt1.y = r.y;
pt2.x = pt1.x + r.width;
if(pt2.x >= image.cols) //check that coordinate pt2.x doesn't get out of the image
    pt2.x = image.cols;

pt2.y = pt2.y + r.height;
if(pt2.y >= image.rows) //check that coordinate pt2.y doesn't get out of the image
    pt2.y = image.rows;

并对您计算的每个坐标重复检查。 当您减去时,只需检查坐标> = 0,然后将其设置为0即可。

希望能帮助到你..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM