簡體   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