Есть два способа сделать это: прочитать пикселей один за другим, или получить все пиксели в виде прямоугольника в 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 для немного более подробно
Параметр 'CvRect Toll = новый CvRect (firstImage.get (160,120,30,30)); 'на самом деле не работает, чтобы получить изображение, которое CvRect не может принять в качестве аргумента, я использовал его в своем вопросе, чтобы продемонстрировать, что я хотел получить эту область этого изображения. – cuber
Изображение, которое я получаю Я не уверен, какой тип CV используется для изображения, я получаю изображение из кадра видеозахвата, а затем пытаюсь получить значения этого изображения. Это то, что это 'mat2Img.getImage (mat2Img.mat);' это объект Mat2Image. – cuber
firstImage.type(); вернет int, представляющий один из типов в http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-type Не уверен, как преобразовать число в Java, хотя. –