Функция OpenCV inRange()

Я пытаюсь запустить следующий код:

#include<opencv\cv.h>
#include<opencv\highgui.h>

using namespace cv;


int main() {

    VideoCapture cap;
    cap.open(0);


    while (1) {

Mat src;
Mat threshold;

cap.read(src);

inRange(src, Scalar(0, 0, 0), Scalar(255, 0, 0), threshold);
imshow("thr", threshold);
imshow("hsv", src);

        waitKey(33);
    }
    return 0;
}

Но похоже, что он не фильтрует, потому что при запуске кода появляется только пустое окно.

Как заставить этот код обнаруживать красные цвета?


person Danaro    schedule 28.06.2016    source источник
comment
Вы можете правильно увидеть исходное изображение? или черное окно?   -  person K.M. Shihab Uddin    schedule 28.06.2016
comment
Спасибо за ответ, я правильно вижу исходное изображение.   -  person Danaro    schedule 28.06.2016
comment
вы забыли преобразовать в hsv изображение src; D Кроме того, в OpenCV используется BGR, а не RGB, поэтому вы устанавливаете порог синего канала. Таким образом, в BGR ваши пороги должны быть примерно такими: inRange(src, Scalar(0, 0, 0), Scalar(50, 50, 255), threshold); Лучше использовать цветовое пространство HSV, см. дубликат   -  person Miki    schedule 28.06.2016
comment
Возможный дубликат OpenCV лучше определяет красный цвет?   -  person Miki    schedule 28.06.2016
comment
Спасибо за ответ, я попытался использовать предложение в предоставленном вами лайке, но он также фильтрует и показывает многие другие захваченные объекты, которые изначально не красные, есть ли способ сделать фильтрацию более точной? Кстати, почему я не могу использовать: inRange(src, Scalar(0, 0, 0), Scalar(0, 0, 255), порог);?   -  person Danaro    schedule 29.06.2016
comment
@Miki opencv c++ Scalar в формате HSV или BGR?   -  person user924    schedule 16.03.2018
comment
Скаляры @user — это просто числа   -  person Miki    schedule 16.03.2018


Ответы (1)


Вы должны изменить функцию inRange следующим образом:

inRange(src, Scalar(0, 0, 0), Scalar(255, 255, 255), threshold);

Если вы попытаетесь установить порог только для первого канала (синий канал), тогда вам придется сделать другие каналы свободными, поэтому установите его на 0 в lawerb и его dtype, обычно 255 для np.uint8

E.g.

inRange(src, Scalar(0, 50, 0), Scalar(255, 100, 255), threshold);

эта строка будет сравнивать 2-й канал (зеленый канал) и игнорировать другие.

person Ayad B.S    schedule 29.06.2017