Color blob检测示例应用的this class中第129行到第133行发生了什么?
一些背景:
应用程序中的相机视图如下所示:(请注意,在相机视图中,相机框周围有黑色边框)
(If you can't see the image, check it here.)
从第114行到第128行,发生以下情况。
fn internal_check(acc: &str) -> bool {
let mut chars = acc.chars();
match chars.next() {
Some('-') => internal_check(chars.as_str()),
Some(ch) if ch.is_whitespace() => internal_check(chars.as_str()),
None => true,
_ => false,
}
}
fn main() {
for s in ["foo", "bar", " ", " - "].iter() {
println!("text '{}', checks? {}", s, internal_check(s));
}
}
int cols = mRgba.cols();
给出矩阵中的列数。这里的矩阵是Mat,表示正在显示的帧的实时流中的帧(而不是整个摄像机视图),即它表示正在显示实时流的摄像机视图的一部分,排除摄像机视图的黑色边框
cols()
int rows = mRgba.rows();
给出相机框架中的行数,排除相机视图的黑色边框。
rows()
int xOffset = (mOpenCvCameraView.getWidth() - cols) / 2; int yOffset = (mOpenCvCameraView.getHeight() - rows) / 2;
给出整个摄像机视图中的行数,即摄像机框架加上框架周围摄像机视图的黑色边框。 mOpenCvCameraView.getWidth()
给出摄像机视图左右黑色边框宽度的总和。 (mOpenCvCameraView.getWidth() - cols)
或(mOpenCvCameraView.getWidth() - cols)/2
在一侧给出黑色边框的宽度,即右侧或左侧,摄像机视图的黑色边框。 同样适用于xOffset
yOffset
int x = (int)event.getX() - xOffset; int y = (int)event.getY() - yOffset;
为第一个指针索引返回此事件的X坐标。因此getX()
给出了触摸区域与摄像机视图左侧极端的距离,其中包括左侧的黑色边框。因此getX()
或event.getX()-xOffset
是触摸区域与相机左侧极端侧的距离"帧" (不包括摄像机视图的黑色边框)。 同样适用于int x
。
然后是我不知道的线条。
答案 0 :(得分:0)
我假设您正在询问这些问题:
touchedRect.x = (x>4) ? x-4 : 0;
touchedRect.y = (y>4) ? y-4 : 0;
touchedRect.width = (x+4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x;
touchedRect.height = (y+4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y;
据我所知,它基本上只是确保矩形的高度和宽度不会偏离框架。
分解原因 -
Java中的?
运算符(称为三元运算符)基本上是if / else的简写 - 行touchedRect.x = (x>4) ? x-4 : 0
表示
if (x>4) {
touchedRect.x = x-4;
} else {
touchedRect.x = 0;
}
因此,对于第129行,如果x > 4
,则将touchedRect.x
设置为x-4
,否则设为0
。
第130行,如果y > 4
,则将touchedRect.y
设为y-4
,否则为0
。
第131行,touchedRect.width
如果x+4 - touchedRect.x
变为x+4 < cols
,则touchedRect.width
变为cols - touchedRect.x
第132行,如果touchedRect.height
,则y+4-touchedRect.y
变为y+4 < rows
,否则变为rows - touchedRect.y