cv::Mat::contains(cv::Rect)在Opencv中有什么类似的吗?
背景: 在将对象检测为轮廓并尝试使用cv :: boundingRect访问ROI后,我的应用程序崩溃了.好的,那是因为靠近图像边界的对象的边界可能不完全在图像内.
现在我通过此检查跳过不完全在图像中的对象:
if(
cellRect.x>0 &&
cellRect.y>0 &&
cellRect.x + cellRect.width < m.cols &&
cellRect.x + cellRect.width < m.rows) ...
Run Code Online (Sandbox Code Playgroud)
其中cellRect是对象的边界矩形,m是图像.我希望有一个专用的opencv功能.
her*_*tao 25
简单的方法是使用AND(ie &)运算符.
假设您要检查是否cv::Rect rect在里面cv::Mat mat:
bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
Run Code Online (Sandbox Code Playgroud)
您可以创建矩形"表示"(x,y = 0,宽度和高度等于图像宽度和高度)图像,并检查它是否包含轮廓的边界.要实现这一点,你需要使用rect交叉 - 在OpenCV中它非常简单,只需使用rect1 & rect2.希望代码说清楚:
cv::Rect imgRect = cv::Rect(cv::Point(0,0), img.size());
cv::Rect objectBoundingRect = ....;
cv::Rect rectsIntersecion = imgRect & objectBoundingRect;
if (rectsIntersecion.area() == 0)
//object is completely outside image
else if (rectsIntersecion.area() == objectBoundingRect.area())
//whole object is inside image
else
//((double)rectsIntersecion.area())/((double)objectBoundingRect.area()) * 100.0 % of object is inside image
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9436 次 |
| 最近记录: |