kames 0 Жалоба Опубликовано October 23, 2012 Добрый день форумчани стала такая задача как расспознание квадратов одинаковых размеров но разных цветов и запись их в массив последовательности 1 2 3 квадрат а не так чтобы допустим 3 распознался он и записал первый в массив да и ещё цвета квадратов меняются но есть определённый диапозон цветов.как реализовать запись в массив цвета 1 2 и 3 квадрата? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 23, 2012 Я ничего не понял Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 23, 2012 Добрый день форумчани стала такая задача как расспознание квадратов одинаковых размеров но разных цветов и запись их в массив последовательности 1 2 3 квадрат а не так чтобы допустим 3 распознался он и записал первый в массив да и ещё цвета квадратов меняются но есть определённый диапозон цветов.как реализовать запись в массив цвета 1 2 и 3 квадрата? Забыл упомянуть что квадраты не не подвижны то есть их держить человек все эти данные буду снимать с веб камеры и квадраты расположены почти в плотную друг к другу Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 23, 2012 Найти квадраты и уложить значения их цвета в массив, в порядке расположения квадратов в кадре? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 23, 2012 ну да типа того я понимаю что нужно сделать с помощью их координат но проблема в там что он из-за освещённости может определить сначала два потом один а потом если чуть повернуть то 3 квадрата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 23, 2012 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/ 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 23, 2012 окей спс завтра всё это просмотрю будут проблемы отпишусь.спасибо=) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 23, 2012 Да первая ссылка норм =)у меня была такая идея ну вообщемне нужно распознать кубик Рубика делаю сначала преобразование в HSV выделяю нужные цвета отсеиваю всё ненужное с помощь Кенни выделяю границы делаю апроксимиляцию(избавляюсь от всего мелкого)и с помощью связи периметра и площади нахожу наши кубики и потом заношу их в массив такое возможно сделать или можно что-нибудь лучше придумать ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 23, 2012 да всё это должно работать без вмешательства человека нажал на кнопку получил результат Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 24, 2012 По крайней мере можно с этого начать. Да первая ссылка норм =)у меня была такая идея ну вообщемне нужно распознать кубик Рубика делаю сначала преобразование в HSV выделяю нужные цвета отсеиваю всё ненужное с помощь Кенни выделяю границы делаю апроксимиляцию(избавляюсь от всего мелкого)и с помощью связи периметра и площади нахожу наши кубики и потом заношу их в массив такое возможно сделать или можно что-нибудь лучше придумать ? ЗЫ: нужно распознать кубик Рубика Тогда еще и здесь посмотрите: http://www.compvision.ru/forum/index.php?showtopic=445 делал давно, и думаю, что детектор цвета на основе SVM лучше чем обратная проекция, использованная в примере. Но полезно будет рассмотреть и такой вариант. Самые лучшие решения обычно строятся на комплексе алгоритмов, а не на каком-то одном. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 25, 2012 вот что у меня получилось только криво конечно работает #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(); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 25, 2012 к сожжалению с HSV ещё больше косяков как можно будет доработать алгоритм ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 25, 2012 Ниасилил Ваши условия, касающиеся отношения периметра к площади. Есть пара предложений: попробовать искать черный каркас кубика (то что между клеток). попробовать обучить каскад Хаара на сторону кубика. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 25, 2012 Можете дать парру ссылок на каскад Хаара Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано October 25, 2012 от картинки зависит, как говорилось есть уже готовый детектор прямоугольников, построенный на детекторе линий.(вот сначала покажите что он выводит) так же можно выделить блобы по цвету и если нужно еще фильтровать по Ху моментам и размеру. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 25, 2012 Чуть подробней можно а то я новичок в этом!А через каскад Хаара можно всё что угодно распознать ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 25, 2012 Можно распознать все, что сильно не меняет своей геометрии в кадре, масштаб не особо важен. Для того чтобы каскады Хаара (классификатор Ада-Буст, детектор Виолы-Джонса, это не одно и то-же, но часто их употребляют как синонимы) выделял объекты, нужно сначала обучить каскады Хаара на целевой объект. Для этого берется изображение объекта, из него специальной прогой (createsamples.exe) делаются обучающие примеры. ... бла бла бла, долгое описание обучения каскадов Хаара. ЗЫ: Каскад может учиться несколько суток. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 25, 2012 окей спс Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 25, 2012 Еще ссылка в тему: http://www.cs.ubc.ca/~andrejk/525project/ и еще: http://opencvproject.blogspot.com/2012/04/episode17implementationofthefasthoughtr.html 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 26, 2012 Да ролики прям вдохновили я как раз что то подобное хочу сделать спс=) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано October 26, 2012 Решил сделать с помощью каскада хаара какую литературу почитать чтобы разобраться как происходить обучение(я новичок) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 27, 2012 Первоисточник: http://docs.opencv.org/trunk/doc/user_guide/ug_traincascade.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kames 0 Жалоба Опубликовано November 27, 2012 Помогите разобраться с Хаара.нашёл на форуме что то подобное 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 размеры нашего изображения всё верно? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах