Обнаружение специфических объектов OpenCV - PullRequest
4 голосов
/ 10 октября 2011

Проведя некоторые исследования и прочитав информацию об обнаружении объектов OpenCV, я все еще не уверен, как я могу обнаружить флешку в видеокадре.Что было бы лучшим способом, чтобы я мог обнаружить, даже если пользователь перемещает его.Я буду использовать палку в качестве меча и сделаю из нее световой меч.Какие-нибудь пункты, где я могу начать?Спасибо!

Ответы [ 3 ]

7 голосов
/ 13 октября 2011

Ответом на этот вопрос обычно является преобразование линии Хафа.Преобразование Хафа предназначено для поиска прямых линий (или других контуров) в сцене, и OpenCV может параметризовать эти линии, чтобы вы получили координаты конечных точек.Но, скажи мудрым, если вы делаете эффекты светового меча, вам не нужно заходить так далеко - просто закрасьте палочку оранжевым и сделайте хроматический ключ.Стандартная функция Adobe Premiere, Final Cut Pro, Sony Vegas и т. Д. Версия OpenCV позволяет преобразовывать ваш кадр в цветной режим HSV и изолировать области изображения, которые лежат в нужной области оттенка и насыщенности.1002 *http://opencv.itseez.com/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html?highlight=hough

Вот старая рутина, которую я написал в качестве примера:

//Photoshop-style color range selection with hue and saturation parameters.
//Expects input image to be in Hue-Lightness-Saturation colorspace.
//Returns a binary mask image. Hue and saturation bounds expect values from 0 to 255.
IplImage* selectColorRange(IplImage *image, double lowerHueBound, double upperHueBound, 
                double lowerSaturationBound, double upperSaturationBound) {
    cvSetImageCOI(image, 1);  //select hue channel
    IplImage* hue1 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1);
    cvCopy(image, hue1); //copy hue channel to hue1
    cvFlip(hue1, hue1); //vertical-flip
    IplImage* hue2 = cvCloneImage(hue1); //clone hue image
    cvThreshold(hue1, hue1, lowerHueBound, 255, CV_THRESH_BINARY); //threshold lower bound
    cvThreshold(hue2, hue2, upperHueBound, 255, CV_THRESH_BINARY_INV); //threshold inverse upper bound
    cvAnd(hue1, hue2, hue1); //intersect the threshold pair, save into hue1
    cvSetImageCOI(image, 3); //select saturation channel
    IplImage* saturation1 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1);
    cvCopy(image, saturation1); //copy saturation channel to saturation1
    cvFlip(saturation1, saturation1); //vertical-flip
    IplImage* saturation2 = cvCloneImage(saturation1); //clone saturation image
    cvThreshold(saturation1, saturation1, lowerSaturationBound, 255, CV_THRESH_BINARY); //threshold lower bound
    cvThreshold(saturation2, saturation2, upperSaturationBound, 255, CV_THRESH_BINARY_INV); //threshold inverse upper bound
    cvAnd(saturation1, saturation2, saturation1); //intersect the threshold pair, save into saturation1
    cvAnd(saturation1, hue1, hue1); //intersect the matched hue and matched saturation regions
    cvReleaseImage(&saturation1);
    cvReleaseImage(&saturation2);
    cvReleaseImage(&hue2);
    return hue1;
}

Немного многословно, но вы поняли!

2 голосов
/ 13 октября 2011

Мой старый профессор всегда говорил, что первый закон компьютерного зрения - делать все возможное с изображением, чтобы облегчить вашу работу.

Если у вас есть контроль над внешним видом палки, то вам лучше всего нарисовать палку очень специфического цвета - неоновый розовый или что-то, что вряд ли появится на заднем плане - и затем использовать цвет сегментация в сочетании с маркировкой подключенных компонентов. Это было бы очень быстро.

2 голосов
/ 10 октября 2011

Вы можете начать, следуя методикам распознавания лиц (обучения и обнаружения), написанным для OpenCV.

Если вы ищете конкретные шаги, сообщите мне.

...