roboforum.ru

Технический форум по робототехнике.

Нужна помощь в OpenCV

Нужна помощь в OpenCV

Kames » 01 мар 2012, 01:41

Доброе время суток !Я только начал изучать OpenCV и вот решил написать программку распознания кубиков с web камеры вот листинг программы.
Код: Выделить всёРазвернуть
#include <cv.h>           
#include <highgui.h>
#include <stdio.h>
#include <iostream.h>

void findCircles(IplImage* _image)
{
        assert(_image!=0);

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

       
        cvConvertImage(_image, bin, CV_BGR2GRAY);
       
        cvCanny(bin, bin, 50, 200);
        /*IplImage* dts = 0;
        dts = cvCloneImage(bin);
               cvSmooth(dts,bin, CV_GAUSSIAN, 3, 3);*/

       // cvNamedWindow( "bin", 1 );
        //cvShowImage("bin", bin);

       
        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 );

        assert(contours!=0);

       
        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<<"  ";
                                // 1/4*CV_PI = 0,079577
               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)))){ // â 10% èíòåðâàëå
                        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);
        assert(capture!=0);
IplImage* frame = 0;
//IplImage* dst = 0;
//CvSeq* contours = 0;
        while(true){
               frame = cvQueryFrame( capture );
               cvShowImage("capture", frame); 
               // dst = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 3 );
               findCircles(frame);
                cvShowImage("image", frame);
               // cvShowImage("ima", dts);
                char c = cvWaitKey(1);
                if (c == 27) {
                        break;
                }
        }

     
        cvReleaseCapture( &capture );
      //  cvReleaseImage(&dst);
        cvDestroyAllWindows();
}

После первого запуска программа работала нормально но на следущий день когда сел дописывать программа начала выдавать ошибку не пойму где косячнул.И если не сложно помогите упростить алгоритм я понимаю что она написана криво но это всего лишь прототип заранее спасибо за помощь.

Re: Нужна помощь в OpenCV

avr123.nm.ru » 01 мар 2012, 10:10

наверно надо ошибку указать

Re: Нужна помощь в OpenCV

noonv » 01 мар 2012, 10:15

подробности в студию :)

Re: Нужна помощь в OpenCV

Kames » 01 мар 2012, 16:42

avr123.nm.ru писал(а):наверно надо ошибку указать

Ошибок при компиляции он не выдаёт а вот во время запуска вот такая штука вылетает
123.jpg

Re: Нужна помощь в OpenCV

Kames » 01 мар 2012, 21:56

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

Re: Нужна помощь в OpenCV

noonv » 01 мар 2012, 22:21

версия библиотеки? винды, компилятора?

Re: Нужна помощь в OpenCV

Kames » 01 мар 2012, 22:55

библиотека 2.1 винда 7 компилятор Dev C++ 4.9.9.2

Re: Нужна помощь в OpenCV

avr123.nm.ru » 24 сен 2012, 10:01

Помогите добавить вывод в COM порт координат рамки обрамляющей распознанное лицо в кадре и номер этого лица в базе данных.
http://docs.opencv.org/trunk/modules/co ... ition.html
Желательно выводить координату центра рамки относительно центра кадра, т.е. если рамка по центру то координата 128,128 а прав.верхн. угол 256,256 или типа того.

Для знающего чела это наверно просто судя по куску кода размещающего имя опознанного под рамкой
Код: Выделить всёРазвернуть
string box_text = format("Prediction = %d", prediction);
            // Calculate the position for annotated text (make sure we don't
            // put illegal values in there):
            int pos_x = std::max(face_i.tl().x - 10, 0);
            int pos_y = std::max(face_i.tl().y - 10, 0);
            // And now put it into the image:
            putText(original, box_text, Point(pos_x, pos_y), FONT_HERSHEY_PLAIN, 1.0, CV_RGB(0,255,0), 2.0);


Rambler\'s Top100 Mail.ru counter