gpt4 book ai didi

c++ - 了解 OpenCV C++ 中的矩形

转载 作者:太空宇宙 更新时间:2023-11-03 22:31:00 25 4
gpt4 key购买 nike

我正在尝试标记矩形内的像素。要标记的矩形在 if-else 结构中决定。使用在任一 if-else block 中定义的矩形时出现以下错误:“断言失败(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 返回的矩形 vector 。令我困惑的是,如果我在 if-else block 之外声明 rectangle_inner 和 rectangle_outer(如代码片段中注释掉的那样,就在 else 条件下方),代码在“if”条件的情况下工作正常不是真的。所以基本上我应该在 if-else block 之外声明我的 rectangle_inner 和 rectangle_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。

希望对你有帮助..

关于c++ - 了解 OpenCV C++ 中的矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24646069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com