2017-02-22 39 views
1

Я новичок в использовании Opencv с Java. У меня есть изображение Mat, и я пытаюсь читать пиксели в определенной области, поэтому позже я могу пройти через эту область и определить HSV, что я пытаюсь использовать CvRect, чтобы получить координаты и размер области, которую я хочу получить образ. Как я получу эту область изображения?Как получить область пикселей изображения Mat Image

Mat firstImage = Imgcodecs.imread("firstImage.png"); 
    CvRect topL = new CvRect(firstImage.get(160, 120, 30, 30)); 

ответ

1

Есть два способа сделать это: прочитать пикселей один за другим, или получить все пиксели в виде прямоугольника в Java для всего изображения, а затем работать с большим массивом. Какой из них лучше всего, вероятно, зависит от того, насколько велика проблема. Приведенный ниже код сначала получает указанную прямую часть изображения в массив Java.

import java.awt.Color; 
import org.opencv.core.Core; 
import org.opencv.core.Mat; 
import org.opencv.core.Rect; 
import org.opencv.highgui.Highgui; 

public class OpenCVThing 
{ 
    public static void main(String[] args) 
    { 
     String opencvpath = System.getProperty("user.dir") + "\\lib\\"; 
     System.load(opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll"); 
     // Get the whole rect into smallImg 
     Mat firstImage = Highgui.imread("capture.png"); 
     System.out.println("total pxels:" + firstImage.total()); 
     // We are getting a column 30 high and 30 wide 
     int width = 30; 
     int height = 30; 
     Rect roi = new Rect(120, 160, width, height); 
     Mat smallImg = new Mat(firstImage, roi); 
     int channels = smallImg.channels(); 
     System.out.println("small pixels:" + smallImg.total()); 
     System.out.println("channels:" + smallImg.channels()); 
     int totalBytes = (int)(smallImg.total() * smallImg.channels()); 
     byte buff[] = new byte[totalBytes]; 
     smallImg.get(0, 0, buff); 

     // assuming it's of CV_8UC3 == BGR, 3 byte/pixel 
     // Effectively assuming channels = 3 
     for (int i=0; i< height; i++) 
     { 
      // stride is the number of bytes in a row of smallImg 
      int stride = channels * width; 
      for (int j=0; j<stride; j+=channels) 
      { 
       int b = buff[(i * stride) + j]; 
       int g = buff[(i * stride) + j + 1]; 
       int r = buff[(i * stride) + j + 2]; 
       float[] hsv = new float[3]; 
       Color.RGBtoHSB(r,g,b,hsv); 
       // Do something with the hsv. 
       System.out.println("hsv: " + hsv[0]); 
      } 
     } 
    } 
} 

Примечание 1: В этом случае, каждый байт в бафф представляет собой третью часть пикселя, потому что я предположил формат является CV_8UC3.

Код был протестирован на скриншоте этого ответа со следующим выходом:

total pxels:179305 
small pixels:900 
channels:3 
hsv: 0.5833333 
hsv: 0.5833333 
hsv: 0.5833333 
hsv: 0.5833333 
hsv: 0.5833333 

etc ... 

См this page и docs для немного более подробно

+0

Параметр 'CvRect Toll = новый CvRect (firstImage.get (160,120,30,30)); 'на самом деле не работает, чтобы получить изображение, которое CvRect не может принять в качестве аргумента, я использовал его в своем вопросе, чтобы продемонстрировать, что я хотел получить эту область этого изображения. – cuber

+0

Изображение, которое я получаю Я не уверен, какой тип CV используется для изображения, я получаю изображение из кадра видеозахвата, а затем пытаюсь получить значения этого изображения. Это то, что это 'mat2Img.getImage (mat2Img.mat);' это объект Mat2Image. – cuber

+0

firstImage.type(); вернет int, представляющий один из типов в http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-type Не уверен, как преобразовать число в Java, хотя. –

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

  • Нет связанных вопросов^_^