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

Распознание предмета

Recommended Posts

Добрый день форумчани стала такая задача как расспознание квадратов одинаковых размеров но разных цветов и запись их в массив последовательности 1 2 3 квадрат а не так чтобы допустим 3 распознался он и записал первый в массив да и ещё цвета квадратов меняются но есть определённый диапозон цветов.как реализовать запись в массив цвета 1 2 и 3 квадрата?

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


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

Я ничего не понял :)

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


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

Добрый день форумчани стала такая задача как расспознание квадратов одинаковых размеров но разных цветов и запись их в массив последовательности 1 2 3 квадрат а не так чтобы допустим 3 распознался он и записал первый в массив да и ещё цвета квадратов меняются но есть определённый диапозон цветов.как реализовать запись в массив цвета 1 2 и 3 квадрата?

Забыл упомянуть что квадраты не не подвижны то есть их держить человек все эти данные буду снимать с веб камеры и квадраты расположены почти в плотную друг к другу

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


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

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

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


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

ну да типа того я понимаю что нужно сделать с помощью их координат но проблема в там что он из-за освещённости может определить сначала два потом один а потом если чуть повернуть то 3 квадрата

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


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

1)Можно научить программу возможным цветам квадратов.

см., например здесь: http://www.compvision.ru/forum/index.php?showtopic=861 (10-й пост)

Затем детектировать центр найденной области.

2) Можно попробовать сначала более простой вариант

Детектировать грани, как здесь: http://www.compvision.ru/forum/index.php?showtopic=1035

И по этим граням искать квадраты, как в OpenCV-шных примерах (opencv\samples\cpp\squares.cpp).

3)Еще может пригодится http://code.google.com/p/cvblob/

  • Like 1

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


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

окей спс завтра всё это просмотрю будут проблемы отпишусь.спасибо=)

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


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

Да первая ссылка норм =)у меня была такая идея ну вообщемне нужно распознать кубик Рубика делаю сначала преобразование в HSV выделяю нужные цвета отсеиваю всё ненужное с помощь Кенни выделяю границы делаю апроксимиляцию(избавляюсь от всего мелкого)и с помощью связи периметра и площади нахожу наши кубики и потом заношу их в массив такое возможно сделать или можно что-нибудь лучше придумать ?

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


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

да всё это должно работать без вмешательства человека нажал на кнопку получил результат

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


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

По крайней мере можно с этого начать.

Да первая ссылка норм =)у меня была такая идея ну вообщемне нужно распознать кубик Рубика делаю сначала преобразование в HSV выделяю нужные цвета отсеиваю всё ненужное с помощь Кенни выделяю границы делаю апроксимиляцию(избавляюсь от всего мелкого)и с помощью связи периметра и площади нахожу наши кубики и потом заношу их в массив такое возможно сделать или можно что-нибудь лучше придумать ?

ЗЫ:

нужно распознать кубик Рубика
Тогда еще и здесь посмотрите: http://www.compvision.ru/forum/index.php?showtopic=445 делал давно, и думаю, что детектор цвета на основе SVM лучше чем обратная проекция, использованная в примере. Но полезно будет рассмотреть и такой вариант. Самые лучшие решения обычно строятся на комплексе алгоритмов, а не на каком-то одном.

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


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

вот что у меня получилось только криво конечно работает

#include "opencv2/core/core.hpp"

#include "opencv2/core/mat.hpp"

#include "opencv2/gpu/gpu.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/contrib/contrib.hpp"

#include "opencv2/video/tracking.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/legacy/legacy.hpp"

#include "opencv2/legacy/compat.hpp"

#include <iostream>

#include <stdlib.h>

#include <stdio.h>


using namespace cv;

using namespace std;

void findKubiks(IplImage* image)

{CvSize size = cvSize(640,480);

    CvSeq* lines = 0;

   // CvScalar hsv_min = cvScalar(0, 34, 109, 0);

   // CvScalar hsv_max = cvScalar(196, 256, 256, 0);

   // IplImage *  hsv_frame    = cvCreateImage(size, IPL_DEPTH_8U, 3);

   //     IplImage*  thresholded   = cvCreateImage(size, IPL_DEPTH_8U, 1);

        IplImage* bin = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1);

   //     cvCvtColor(image, hsv_frame, CV_BGR2HSV);

   //    cvInRangeS(hsv_frame, hsv_min, hsv_max, thresholded);

        cvConvertImage(image, bin, CV_BGR2GRAY);//Перевод в чёрно-белое изображение

        cvCanny(bin, bin, 50, 200);//Преобразование Кенни для изображения

        CvMemStorage* storage = cvCreateMemStorage(0);

        CvSeq* contours=0;

        int contoursCont = cvFindContours( bin, storage,&contours,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));

        contours = cvApproxPoly( contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 );

        lines = cvHoughLines2( bin, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 );//Преобразование Хафа для линии

        if(contours==NULL);

        {


        }


        for( CvSeq* current = contours; current != NULL; current = current->h_next ){

        double area = 0;double perim = 0;

        area = fabs(cvContourArea(current));

        perim = cvContourPerimeter(current);

        cout<<"fuk"<<area/perim<<"  ";

        cout<<"fup"<<perim/16<<"  ";

        if (((perim/4>=4*area/perim) && (perim/4<=(4*area/perim*0.05)+(4*area/perim)))

        ||((perim/16>=area/perim) && (perim/16<=(area/perim*0.05)+(area/perim)))

        ||((4*area/perim>=perim/4) && (4*area/perim<=(perim/4*0.05)+(perim/4)))

        ||((area/perim>=perim/16) && (area/perim<=(perim/16*0.05)+(perim/16)))){

                        cvDrawContours(image, current, cvScalar(255,0, 0), cvScalar(0,255, 0),0,4,8);

                }

        }

        cvReleaseMemStorage(&storage);

        cvReleaseImage(&bin);

}


int main(int argc, char* argv[])

{

        cvNamedWindow("capture");

        cvNamedWindow("image");

        CvCapture *capture = cvCreateCameraCapture(CV_CAP_ANY);

        if(capture == NULL)

        {

            int height = 620;int width = 440;

            CvPoint pt = cvPoint( height/4, width/2 );

            IplImage* hw = cvCreateImage(cvSize(height, width), 8, 3);

            cvSet(hw,cvScalar(0,0,0));

            CvFont font;

            cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA);

            cvPutText(hw, "Проверьте Камеру", pt, &font, CV_RGB(150, 0, 150) );

            cvNamedWindow("Fatal ERROR", 0);

            cvShowImage("Hello World", hw);

            cvWaitKey(0);

        }

        IplImage* frame = 0;

        while(true){

               frame = cvQueryFrame( capture );

               cvShowImage("capture", frame);

               findKubiks(frame);

               cvShowImage("image", frame);

               char c = cvWaitKey(1);

               if (c == 27) {break;}

        }

        cvReleaseCapture( &capture );

        cvDestroyAllWindows();

}

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


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

к сожжалению с HSV ещё больше косяков как можно будет доработать алгоритм ?

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


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

Ниасилил Ваши условия, касающиеся отношения периметра к площади.

Есть пара предложений:

попробовать искать черный каркас кубика (то что между клеток).

попробовать обучить каскад Хаара на сторону кубика.

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


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

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

так же можно выделить блобы по цвету и если нужно еще фильтровать по Ху моментам и размеру.

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


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

Чуть подробней можно а то я новичок в этом!А через каскад Хаара можно всё что угодно распознать ?

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


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

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

Для того чтобы каскады Хаара (классификатор Ада-Буст, детектор Виолы-Джонса, это не одно и то-же, но часто их употребляют как синонимы)

выделял объекты, нужно сначала обучить каскады Хаара на целевой объект.

Для этого берется изображение объекта, из него специальной прогой (createsamples.exe) делаются обучающие примеры.

... бла бла бла, долгое описание обучения каскадов Хаара.

ЗЫ: Каскад может учиться несколько суток.

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


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

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


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

Да ролики прям вдохновили я как раз что то подобное хочу сделать спс=)

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


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

Решил сделать с помощью каскада хаара какую литературу почитать чтобы разобраться как происходить обучение(я новичок)

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


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

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


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

Помогите разобраться с Хаара.нашёл на форуме что то подобное opencv_createsamples.exe -img overview.jpg -num 75 -bg negatives.dat -vec samples.vec -maxxangle 0 -maxyangle 0 -maxzangle 0 -maxidev 20 -bgcolor 0 -bgthresh 10 -w 1024 -h 768 -show

overview.jpg-наше искомое изображение т.е мне нужно будет вырезать допустим кубик из изображения или можно оставить его с фоном?

75-число образцов

negatives.dat-наше негативные изображения вопрос если я буду показывать кубик на негативном фоне которого нет в базе он у меня расспознается?

samples.vec-выходные изображения

-maxxangle 0 -maxyangle 0 -maxzangle 0 углы

-maxidev 20-максимальное допустимое колебание точек

-bgcolor 0-цвет фона

-bgthresh 10 вроде как размытие что ли

-w 1024 -h 768 -show размеры нашего изображения

всё верно?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×