Порог для цвета в opencv - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь настроить мою программу на порог для цвета (в формате BGR).Я еще не полностью решил, какой цвет я буду искать.Я также хотел бы, чтобы программа записала, сколько пикселей она обнаружила этого цвета.Мой код пока ниже, но он не работает.

#include "cv.h"
#include "highgui.h"




int main()
{
 // Initialize capturing live feed from the camera
CvCapture* capture = 0;
capture = cvCaptureFromCAM(0);

// Couldn't get a device? Throw an error and quit
if(!capture)
{
    printf("Could not initialize capturing...\n");
    return -1;
}
 // The two windows we'll be using
cvNamedWindow("video");
cvNamedWindow("thresh");

 // An infinite loop
while(true)
{
    // Will hold a frame captured from the camera
    IplImage* frame = 0;
    frame = cvQueryFrame(capture);

            // If we couldn't grab a frame... quit
    if(!frame)
        break;


    //create image where threshloded image will be stored
    IplImage* imgThreshed = cvCreateImage(cvGetSize(frame), 8, 1);


    //i want to keep it BGR format. Im not sure what colour i will be looking for yet. this can be easily changed
    cvInRangeS(frame, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);


    //show the original feed and thresholded feed
    cvShowImage("thresh", imgThreshed);
    cvShowImage("video", frame);

    // Wait for a keypress
    int c = cvWaitKey(10);
    if(c!=-1)
    {
        // If pressed, break out of the loop
        break;
    }

    cvReleaseImage(&imgThreshed);
}
cvReleaseCapture(&capture);
return 0;

}

Ответы [ 2 ]

3 голосов
/ 31 января 2012

К порогу для цвета,

1) преобразовать изображение в HSV

2) Затем применить cvInrangeS

3) Как только вы получите пороговое изображение, вы можете подсчитать числобелых пикселей в нем.

Попробуйте этот урок для отслеживания желтого цвета: Отслеживание цветных объектов в OpenCV

2 голосов
/ 06 января 2016

Я могу рассказать, как это сделать на Python и C ++, а также с преобразованием в HSV и без него.

Версия C ++ (преобразование в HSV)

  1. Преобразование изображения в изображение HSV:

    // Convert the image into an HSV image IplImage* imgHSV = cvCreateImage(cvGetSize(img), 8, 3); cvCvtColor(img, imgHSV, CV_BGR2HSV);

  2. Создайте новое изображение, которое будет содержать изображение с резьбой:

    IplImage* imgThreshed = cvCreateImage(cvGetSize(img), 8, 1);

  3. Выполнить фактическое определение порога с помощью cvInRangeS

    cvInRangeS(imgHSV, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);

Здесь imgHSV - эталонное изображение. И два cvScalars представляют нижнюю и верхнюю границы значений, которые имеют желтоватый цвет. (Эти границы должны работать почти во всех условиях. Если это не так, попробуйте поэкспериментировать с двумя последними значениями).

Рассмотрим любой пиксель. Если все три значения этого пикселя (H, S и V в этом порядке) лежат в пределах указанных диапазонов, imgThreshed получает значение 255 для этого соответствующего пикселя. Это повторяется для всех пикселей. Итак, что вы в итоге получите, это изображение с пороговым значением.

  1. Используйте countNonZero для подсчета количества белых пикселей в пороговом изображении.

Версия Python (без преобразования в HSV):

  1. Создайте нижнюю и верхнюю границы интересующего вас диапазона в формате массива Numpy (Примечание: вам нужно использовать import numpy as np)

lower = np.array((a,b,c), dtype = "uint8") upper = np.array((x,y,z), dtype = "uint8")

В приведенном выше примере (a,b,c) является нижней границей, а (x,y,z) является верхней границей.

2. Получите маску для пикселей, которые удовлетворяют диапазону:

mask = cv2.inRange(image, lower, upper)

В приведенном выше примере image - это изображение, над которым вы хотите работать.

  1. Подсчитайте количество белых пикселей, присутствующих в маске, используя countNonZero:

yellowpixels = cv2.countNonZero(mask) print "Number of Yellow pixels are %d" % (yellowpixels)

Источники:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...