Перейти к содержимому
Compvision.ru
cooller51190

Выделение объекта вокруг точки

Recommended Posts

Добрый день имеется вот такое изображение. 

Необходимо выделить одну мишень внутри которой поставлена мышкой точка. Точка ставиться следующим образом.

#include "stdafx.h"
#include <fstream>
#include <iomanip>
#include <iostream>
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
#include "stdlib.h"
#include "math.h"
#include "sstream"
#include "string"
#include "windows.h"
#include <locale.h>
#include <conio.h>
using std::cout;
using namespace cv;
using namespace std;
IplImage* image = 0;
IplImage* src = 0;

// рисуем целеуказатель
void drawTarget(IplImage* img, int x, int y, int radius)
{
        cvCircle(img,cvPoint(x, y),radius,CV_RGB(250,0,0),1,8);
        cvLine(img, cvPoint(x-radius/2, y-radius/2), cvPoint(x+radius/2, y+radius/2),CV_RGB(250,0,0),1,8);
        cvLine(img, cvPoint(x-radius/2, y+radius/2), cvPoint(x+radius/2, y-radius/2),CV_RGB(250,0,0),1,8);
}

// обработчик событий от мышки
void myMouseCallback( int event, int x, int y, int flags, void* param )
{
        IplImage* img = (IplImage*) param;

        switch( event ){
                case CV_EVENT_MOUSEMOVE: 
                        break;

                case CV_EVENT_LBUTTONDOWN:
                        printf("%d x %d\n", x, y);
                        drawTarget(img, x, y, 10);
                        break;

                case CV_EVENT_LBUTTONUP:
                        break;
        }
}

int main(int argc, char* argv[])
{
        // имя картинки задаётся первым параметром
        char* filename = argc == 2 ? argv[1] : "Image0.jpg";
        // получаем картинку
        image = cvLoadImage(filename,1);
        // клонируем картинку 
        src = cvCloneImage(image);

        printf("[i] image: %s\n", filename);
        assert( src != 0 );

        // окно для отображения картинки
        cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

        // вешаем обработчик мышки
        cvSetMouseCallback( "original", myMouseCallback, (void*) image);

        while(1){
                // показываем картинку
                cvCopyImage( image, src );
                cvShowImage( "original", src );

                char c = cvWaitKey(33);
                if (c == 27) { // если нажата ESC - выходим
                        break;
                }
        }

        // освобождаем ресурсы
        cvReleaseImage(&image);
        cvReleaseImage(&src);
        // удаляем окно
        cvDestroyWindow("original");
        return 0;
}

Необходима возможность выделения по белому контуру чтоб выделенный контур либо скопировать либо сохранить как новое изображение. Может например просто выделить объект внутри контура с белым цветом.

Подскажите как это возможно реализовать. 

AZvSc2xuVyM.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю floodfill тут поможет. См. флаг FLOODFILL_MASK_ONLY.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Посмотрел данную функцию, как я понял она выделяет (закрашивает) по выбранному цвету (http://robocraft.ru/blog/computervision/338.html нашел только такой пример работы данной функции), а если допустим на белом фоне размещено несколько объектов (например изображение 1), а после  в качестве обрабатываемого в дальнейшем изображения мне нужно получить изображение 2 (это мишень номер 1 на первом изображение). Возможно ли это как то реализовать?  Или подскажите пожалуйста наиболее подходящий способ выделения этой части объекта? Мне для дальнейшей обработки необходимо получить на входе 1 мишень выбранную человеком. Спасибо за помощь.

Image0.jpg

1.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я бы пошёл другим путём: искал все мишени на кадре, а уже после смотрел, на какую из  них кликнул человек.

Поиск мишеней, на первый взгляд, не выглядит особо сложным, ведь цвета  известны, форма тоже:

1. перевести изображение в HSV;

2. для канала H последовательно сделать три порога, для выделения жёлтой, красной и голубой частей;

3. на каждом результате пороговой бинаризации найти контуры;

4. оставить только те контуры, которые лежат друг в друге.

Если освещение постоянное, то подход должен сработать. А там смотреть по результатам - можно и доуточнить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×