У меня есть пороговое изображение в Android на основе определенных минимальных и максимальных значений H, S и V. Я делаю это следующим образом.Порог цвета в Android (с использованием OpenCV)
Mat raw=new Mat();
Mat hsv=new Mat();
org.opencv.android.Utils.bitmapToMat(bitmap, raw);
Imgproc.cvtColor(raw, hsv, Imgproc.COLOR_RGB2HSV);
Imgproc.cvtColor(raw, raw, Imgproc.COLOR_RGB2GRAY);
Mat thresh = new Mat(raw.size(), CvType.CV_8UC1);
for(int x=0;x<raw.cols();x++)
{
for(int y=0;y<raw.rows();y++)
{
double[] data = hsv.get(y,x);
double H = data[0];
double S = data[1];
double V = data[2];
if(H_MIN<=H && H<=H_MAX && S_MIN<=S && S<=S_MAX && V_MIN<=V && V<=V_MAX) {
data = new double[] {255};
thresh.put(y,x, data);
}
else
{
data = new double[] {0};
thresh.put(y,x, data);
}
}
}
Это прекрасно работает, но занимает много времени для большого изображения. Есть ли более быстрый и эффективный способ сделать это? (Есть ли функция в OpenCV для этого, может быть?)
В Python я мог бы просто сделать следующее, используя numpy
, что довольно быстро.
img = cv2.imread(name,1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h = hsv[:,:,0]
s = hsv[:,:,1]
v = hsv[:,:,2]
mask = np.zeros((img.shape[0],img.shape[1]), dtype='uint8')
mask[((h >= minH) & (h <= maxH) & (s >= minS) & (s <= maxS) & (v >= minV) & (v <= maxV))] = 255
попытаться получить/поместить данные изображения за строку вместо пикселя, что ускорит выполнение. – hariprasad