2016-02-08 4 views
0

Я новичок в OpenCV, но с немного удачи и много времени я был в состоянии взломать вместе некоторый код, который определяет отдельные ячейки в шахматной доске так:Как получить пиксели внутри четырехугольника, определенные четырьмя точками в OpenCV?

chessboard

изображение кадра хранится в Mat, а углы хранятся в MatOfPoint2f.

кода, чтобы показать, как я использую матрицы для рисования клетки в отдельности:

private void draw(final Mat frame) { 
    for (int x = 0; x < BOARD_SIZE - 1; x++) 
     for (int y = 0; y < BOARD_SIZE - 1; y++) { 
      final int index = x + y * BOARD_SIZE; 
      final Point topLeft = cornerPoints.get(index); 
      final Point bottomLeft = cornerPoints.get(index + BOARD_SIZE); 
      final Point topRight = cornerPoints.get(index + 1); 
      final Point bottomRight = cornerPoints.get(index + 1 + BOARD_SIZE); 

      // left line 
      Imgproc.line(frame, topLeft, bottomLeft, DEBUG_COLOR); 
      // right line 
      Imgproc.line(frame, topRight, bottomRight, DEBUG_COLOR); 
      // top line 
      Imgproc.line(frame, topLeft, topRight, DEBUG_COLOR); 
      // bottom line 
      Imgproc.line(frame, bottomLeft, bottomRight, DEBUG_COLOR); 
     } 
} 

Как бы использовать четыре точки (по углам ячеек), чтобы получить значение RGB пикселов внутри каждого четырехугольника?

ответ

2

Создайте маску из ваших вершин. Вы можете использовать fillPoly для этого. Затем итерация по пикселям. Если пиксель (x, y) действителен в вашей маске, прочтите RGB else continue. Ограничьте диапазон итераций пикселей, используя крайние вершины.

+3

Если внешний контур известен, 'cv :: drawContours' также может использоваться, не уверен, какой из них быстрее. Чтобы ускорить обработку маски, ROI можно вычислить с помощью 'cv :: boundingRect', который можно использовать в качестве маски для маски и изображения. – Micka

+0

Спасибо вам всем! Похоже, все будет отлично. Я проверю его, как только вернусь домой – 64test1234

+0

@ Микка, знаете ли вы, почему, когда я получаю неправильные значения RGB? Я получаю его, выполняя 'byte [] rgb = новый байт [3]; frame.get (x_, y_, rgb); 'и для белого/серого пикселя он возвращает -117, -107, -109 в массив байтов. И дело не только в том, что оно неподписанно, потому что этот цвет будет черным, если предполагается, что он будет белым/серым. Я знаю, что он проверяет правильный пиксель – 64test1234

1

Маскирующие работы. Если у вас много полигонов или не слишком много ОЗУ, тест с точки в полигоне может быть более эффективным, особенно если вы можете гарантировать, что ваши четырехугольники выпуклые. См. this reference

Смежные вопросы