OpenCV4Android示例应用程序 - 这段代码片段做了什么?

时间:2016-01-08 09:39:52

标签: opencv opencv3.0 opencv4android

Color blob检测示例应用的this class中第129行到第133行发生了什么?

一些背景:

应用程序中的相机视图如下所示:(请注意,在相机视图中,相机框周围有黑色边框)

ImageIf you can't see the image, check it here.

从第114行到第128行,发生以下情况。

  1. 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,表示正在显示的帧的实时流中的帧(而不是整个摄像机视图),即它表示正在显示实时流的摄像机视图的一部分,排除摄像机视图的黑色边框

  2. cols() int rows = mRgba.rows();给出相机框架中的行数,排除相机视图的黑色边框。

  3. rows() int xOffset = (mOpenCvCameraView.getWidth() - cols) / 2; int yOffset = (mOpenCvCameraView.getHeight() - rows) / 2;给出整个摄像机视图中的行数,即摄像机框架加上框架周围摄像机视图的黑色边框。 mOpenCvCameraView.getWidth()给出摄像机视图左右黑色边框宽度的总和。 (mOpenCvCameraView.getWidth() - cols)(mOpenCvCameraView.getWidth() - cols)/2在一侧给出黑色边框的宽度,即右侧或左侧,摄像机视图的黑色边框。 同样适用于xOffset

  4. yOffset int x = (int)event.getX() - xOffset; int y = (int)event.getY() - yOffset;为第一个指针索引返回此事件的X坐标。因此getX()给出了触摸区域与摄像机视图左侧极端的距离,其中包括左侧的黑色边框。因此getX()event.getX()-xOffset是触摸区域与相机左侧极端侧的距离"帧" (不包括摄像机视图的黑色边框)。 同样适用于int x

  5. 然后是我不知道的线条。

1 个答案:

答案 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