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

cooller51190

Пользователи
  • Количество публикаций

    21
  • Зарегистрирован

  • Посещение

Репутация

0 Новичек

О cooller51190

  • Звание
    Бывалый
  1. Необходимо в консольном приложение нарисовать квадрат. Данное действие необходимо делать не через код, с заранее заданными координатами левого верхнего угла, ширины и высоты, Нарисовать необходимо с помощью мыши. Подскажите как это сделать? И получить вывод консоли данных по данному объекту, начальную точку, ширину и высоту. Нашел вот такой способ. void myMouseCallback( int event, int x, int y, int flags, void* param) { IplImage* img = 0; switch( event ){ case CV_EVENT_MOUSEMOVE: //printf("%d x %d\n", x, y); break; case CV_EVENT_LBUTTONDOWN: //printf("%d x %d\n", region_coordinates[0], region_coordinates[1]); if (region_coordinates[0] != 0 && region_coordinates[1] != 0 && region_coordinates[2] == 0 && region_coordinates[3] == 0) { region_coordinates[2]=x; region_coordinates[3]=y; } if (region_coordinates[0] == 0 && region_coordinates[1] == 0) { region_coordinates[0]=x; region_coordinates[1]=y; } break; case CV_EVENT_RBUTTONDOWN: break; case CV_EVENT_LBUTTONUP: break; } } int main(int argc, char** argv) {IplImage* image = 0; // имя картинки задаётся первым параметром char* filename = argc == 2 ? argv[1] : "Image0.jpg"; // получаем картинку image = cvLoadImage(filename,1); // клонируем картинку printf("[i] image: %s\n", filename); assert( src != 0 ); // окно для отображения картинки cvNamedWindow("Motion",CV_WINDOW_AUTOSIZE); for(;;) { cvSetMouseCallback( "Motion", myMouseCallback, (void*) image); if (region_coordinates[0] != 0 && region_coordinates[1] != 0 && region_coordinates[2] == 0 && region_coordinates[3] == 0) cvRectangle(image, cvPoint(region_coordinates[0],region_coordinates[1]), cvPoint(region_coordinates[0]+1,region_coordinates[1]+1), CV_RGB(0,0,255), 2, CV_AA, 0 ); if (region_coordinates[0] != 0 && region_coordinates[1] != 0 && region_coordinates[2] != 0 && region_coordinates[3] != 0) cvRectangle(image, cvPoint(region_coordinates[0],region_coordinates[1]), cvPoint(region_coordinates[2],region_coordinates[3]), CV_RGB(0,0,255), 2, CV_AA, 0 ); cvShowImage( "Motion", image ); char c = cvWaitKey(20); if (c <=57 && c>= 48) { dig_key=c-48; //key "0123456789" } } cvReleaseImage(&image); cvDestroyWindow( "Motion" ); return 0; } Никак не могу понять как из этого вывести мне начальную координату верхнего левого угла, ширину и высоту квадрата. А так же если нарисовали не верно, то по нажатию кнопки убрать его. Подскажите, кто знает.
  2. Выделение объекта вокруг точки

    Посмотрел данную функцию, как я понял она выделяет (закрашивает) по выбранному цвету (http://robocraft.ru/blog/computervision/338.html нашел только такой пример работы данной функции), а если допустим на белом фоне размещено несколько объектов (например изображение 1), а после в качестве обрабатываемого в дальнейшем изображения мне нужно получить изображение 2 (это мишень номер 1 на первом изображение). Возможно ли это как то реализовать? Или подскажите пожалуйста наиболее подходящий способ выделения этой части объекта? Мне для дальнейшей обработки необходимо получить на входе 1 мишень выбранную человеком. Спасибо за помощь.
  3. Добрый день имеется вот такое изображение. Необходимо выделить одну мишень внутри которой поставлена мышкой точка. Точка ставиться следующим образом. #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; } Необходима возможность выделения по белому контуру чтоб выделенный контур либо скопировать либо сохранить как новое изображение. Может например просто выделить объект внутри контура с белым цветом. Подскажите как это возможно реализовать.
  4. Подскажите пожалуйста, каким способом можно выделить из вот такого изображения обе мишени (отдельно) по изображению шаблону, и сохранить каждое выделенное изображение в отдельный файл? Заранее спасибо.
  5. Работа с контурами

    Спасибо огромное. Действительно не хватало [idx].
  6. Работа с контурами

    А вот с этим я увы не знаю. Подскажите как правильно ей передать тот или иной контур? Я думал поставив в цикл при рисование контура, for (size_t idx = 0; idx < contours.size(); idx++) { cv::drawContours(contourImage, contours, idx, colors[idx % 3]); cout << cv::pointPolygonTest(contours,Point2f(250,300), false)<<std::endl; // При добавление этой строки ошибка }она будет проверять каждый контур. Но вот как правильно это сделать не знаю. Буду благодарен за вашу помощь если подскажите.
  7. Работа с контурами

    Ну судя по документации pointPolygonTest должен проверить точка находиться внутри контура, на граница, или в не контура, выдать соответственно 1 или 0 или -1
  8. Работа с контурами

    Пошагово, нет возможности провести отладку пока что. Ранее у меня был представлен более маленький пример программы. где просто MAT. Там аналогичная проблема. Не могли бы хотя бы просто кинуть пример программы где происходит открытие изображения поиск контура и проверка точки, внутри она или нет. Просто подобных примеров найти не могу. Вот мой пример (упрощенный до минимума) #include "stdafx.h" #include "stdio.h" #include "cv.h" #include "highgui.h" #include "stdlib.h" #include "math.h" #include "sstream" #include "string" using std::cout; using namespace cv; int main(int argc, const char * argv[]) { cv::Mat image= cv::imread("Image2.jpg"); if (!image.data) { std::cout << "Image file not found\n"; // return 1; } //Prepare the image for findContours cv::cvtColor(image, image, CV_BGR2GRAY); cv::threshold(image, image, 128, 255, CV_THRESH_BINARY); //Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten std::vector<std::vector<cv::Point> > contours; cv::Mat contourOutput = image.clone(); cv::findContours( contourOutput, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE ); //Draw the contours cv::Mat contourImage(image.size(), CV_8UC3, cv::Scalar(0,0,0)); cv::Scalar colors[3]; colors[0] = cv::Scalar(255, 0, 0); colors[1] = cv::Scalar(0, 255, 0); colors[2] = cv::Scalar(0, 0, 255); for (size_t idx = 0; idx < contours.size(); idx++) { cv::drawContours(contourImage, contours, idx, colors[idx % 3]); cout << cv::pointPolygonTest(contours,Point2f(250,300), false)<<std::endl; // При добавление этой строки ошибка } cv::imshow("Input Image", image); cvMoveWindow("Input Image", 0, 0); cv::imshow("Contours", contourImage); cvMoveWindow("Contours", 200, 0); cv::waitKey(0); return 0; }На сколько я понимаю при каждом проходе контура он проверяет находиться ли точка с координатой 250, 300 внутри или нет. Но увы выдаёт вот такую ошибку. Прошу прощение за повторение одинаковых сообщений у администраторов. Подскажите в чём я тут ошибаюсь? И что возможно необходимо добавить. Или может проблема где-то в настройках или в самой студии?
  9. Работа с контурами

    Просто до добавления этой строки, работало всё нормально. Что вообще это может быть и в какую сторону хотя бы искать? По дебагу конкретно сейчас выложить увы не могу. Сейчас полный код выглядит следующим образом. #include "stdafx.h" #include "stdio.h" #include "cv.h" #include "highgui.h" #include "stdlib.h" #include "math.h" #include "sstream" #include "string" using std::cout; using namespace cv; #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif //анализ контуров void ConturAnaliz (cv::Mat image) {//cv::Mat image= cv::imread(_image); if (!image.data) { // std::cout << "Image file not found\n"; // return 1; } //Prepare the image for findContours cv::cvtColor(image, image, CV_BGR2GRAY); cv::threshold(image, image, 128, 255, CV_THRESH_BINARY); //Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten std::vector<std::vector<cv::Point> > contours; cv::Mat contourOutput = image.clone(); cv::findContours( contourOutput, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE ); //Draw the contours cv::Mat contourImage(image.size(), CV_8UC3, cv::Scalar(0,0,0)); cv::Scalar colors[3]; colors[0] = cv::Scalar(255, 0, 0); colors[1] = cv::Scalar(0, 255, 0); colors[2] = cv::Scalar(0, 251, 255); int k1=0; for (size_t idx = 0; idx < contours.size(); idx++, ++k1) { cv::drawContours(contourImage, contours, idx, colors[idx % 3]); }cout << "The number of analyzed contours - " << k1; cout << pointPolygonTest(contours, Point2f(250,300), false)<<std::endl; // Тут возникает ошибка cv::imshow("ConturAnaliz", contourImage); cvMoveWindow("ConturAnaliz", 200, 0); } int main(int argc, char* argv[]) { IplImage *img1=0, *img2=0, *diff=0, *sub=0, *strela=0, *crugi=0, *crugi1=0, *crugi2=0, *gray=0, *crugi_contur=0, *dst=0, *bin=0; int c=0;//переменная для отмены последующего вывода координат int w=0, v=0;//переменнтая для отображения результата временно координаты // дефолтные названия картинок для обработки char file1[] = "Image0.jpg"; char file2[] = "Image1.jpg"; // имя картинки задаётся первым параметром char* filename1 = argc >= 2 ? argv[1] : file1; // получаем картинку img1 = cvLoadImage(filename1); printf("[i] first image: %s\n", filename1); // имя картинки задаётся первым параметром char* filename2 = argc >= 3 ? argv[2] : file2; // получаем картинку img2 = cvLoadImage(filename2); printf("[i] second image: %s\n", filename2); //Создаём однокональное изображение crugi = cvCreateImage( cvGetSize(img1), IPL_DEPTH_8U, 1 ); bin = cvCreateImage( cvGetSize(img1), IPL_DEPTH_8U, 1 ); // получаем границы cvCanny(img1, crugi, 200, 220, 3); cvShowImage("crugi cvCanny",crugi); // покажем первоначальные изображения // cvNamedWindow( "image1"); // cvShowImage( "image1", img1 ); // cvNamedWindow( "image2"); // cvShowImage( "image2", img2 ); //Разница изображений // создаём картинку для хранения разницы diff = cvCloneImage(img1); sub = cvCloneImage(img1); cvZero(diff); // пробегаемся по всем пикселям изображения for( int y=0; y<diff->height; y++ ) { uchar* ptr1 = (uchar*) (img1->imageData + y * img1->widthStep); uchar* ptr2 = (uchar*) (img2->imageData + y * img2->widthStep); uchar* ptr = (uchar*) (diff->imageData + y * diff->widthStep); for( int x=0; x<diff->width; x++ ) { // 3 канала: // B ptr[3*x] = ptr1[3*x] + ptr2[3*x] - 2 * min(ptr1[3*x], ptr2[3*x]); // G ptr[3*x+1] = ptr1[3*x+1] + ptr2[3*x+1] - 2 * min(ptr1[3*x+1], ptr2[3*x+1]); // R ptr[3*x+2] = ptr1[3*x+2] + ptr2[3*x+2] - 2 * min(ptr1[3*x+2], ptr2[3*x+2]); } } // вычитаем cvSub(img1, img2, sub); strela = cvCreateImage( cvGetSize(img1), IPL_DEPTH_8U, 1 ); // выводим результат вычитания cvNamedWindow( "diff"); cvShowImage( "diff", diff ); // cvNamedWindow( "sub"); // cvShowImage( "sub", sub ); // Находим границы вычтенного изображения cvCanny(diff, strela, 300, 320, 3); cvNamedWindow( "strela"); cvShowImage( "strela", strela ); //Поиск первого белого пикселя (конец стрелы) // пробегаемся по всем пикселям изображения c низу вверх, с права на лево // width - ширина изображение height - высота изображения for( int x=0; x<strela->width; x++ ) { // widthStep - расстояние между соседними по вертикали точками изображения (число байт в одной строчке картинки). // Соответственно, для данного случая (при image->imageData == начало массива данных) по арифметике указателей // ptr будет указывать на начало каждой строки массива данных картинки for( int y=0; y<strela->height; y++ ) { int nChan = strela->nChannels; // Определить количество каналов, чтобы реализация не зависела от пользователя. uchar* ptr = (uchar*) (strela->imageData + y * strela->widthStep); // количество каналов вложили в nChan // пробегаемся по всем каналам каждого пикселя // конкретно здесь устанавливаются значения каналов каждого пикселя :) if (c<1){ if (ptr[nChan*x] == 255 && ptr[nChan*x + 1] == 255 && ptr[nChan*x + 2] == 255) { cout << "Pixel is: x -"<< x << " y - " << y << "\n" ; c=1;//переменная для отмены последующего вывода w=x; v=y; } } } } //функция для вывода результатов на изображение char str[11]; sprintf(str, "%d", w);//преобразование числа в строку // задаём точку для вывода текста CvPoint pt = cvPoint(10, 50 ); // инициализация шрифта CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA); // используя шрифт выводим на картинку текст cvPutText(img1, str , pt, &font, CV_RGB(150, 150, 150) ); cvShowImage("Final", img1); //вывод координат найденного конца стрелы (временно, в конце убрать) cout << w; cout << v; //находим контуры //создаём массив для контуров CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours=0; //создание изображения для вывода контуров CvSize ImageSize = cvSize(713, 713); crugi_contur = cvCreateImage(ImageSize, IPL_DEPTH_8U, 3); //поиск контуров int contoursCont = cvFindContours( crugi, storage,&contours,sizeof(CvContour),CV_CHAIN_CODE,CV_CHAIN_APPROX_NONE, cvPoint(0,0)); // double pointPolygonTest(contours,160,160,false); //присвоение переменной 0 для подсчёта количества контуров int k = 0; // рисуем контур if(contours!=0){ for(CvSeq* seq0 = contours; seq0!=0;seq0 = seq0->h_next, ++k){ // рисуем контур cvDrawContours(crugi_contur, seq0, CV_RGB(255,216,0), CV_RGB(255,216,0), 3, 2, 8); } } // выводит количество контуров cout << " " << k; // сглаживаем исходную картинку cvSmooth(crugi_contur, crugi_contur, CV_MEDIAN, 3, 3); cvShowImage("crugi_contur", crugi_contur); //Сохраняем полученные контуры для дальнейшей обработки cvSaveImage("ConturAnaliz.jpg", crugi_contur); //вызов функции анализа изображения ConturAnaliz (crugi_contur); cvWaitKey(0); //освобождаем ресурсы cvReleaseImage(&img1); cvReleaseImage(&img2); cvReleaseImage(&diff); cvReleaseImage(&sub); // удаляем окна cvDestroyAllWindows(); return 0; }
  10. Работа с контурами

    Компиляция проходит нормально, но при запуске возникает вот такая информация в консоли.
  11. Работа с контурами

    Подскажите, кто знает. В какую сторону мне копать?
  12. Работа с контурами

    Да спасибо, посмотрел книжку. Вот возник такой вот вопрос, что я не правильно делаю? Решил через MAT попробовать. Имеется вот такой код который находит мне этот контур (виде окружности) int main(int argc, const char * argv[]) { cv::Mat image= cv::imread("Image0.jpg"); if (!image.data) { std::cout << "Image file not found\n"; // return 1; } //Prepare the image for findContours cv::cvtColor(image, image, CV_BGR2GRAY); cv::threshold(image, image, 128, 255, CV_THRESH_BINARY); //Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten std::vector<std::vector<cv::Point> > contours; cv::Mat contourOutput = image.clone(); cv::findContours( contourOutput, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE ); //Draw the contours cv::Mat contourImage(image.size(), CV_8UC3, cv::Scalar(0,0,0)); cv::Scalar colors[3]; colors[0] = cv::Scalar(255, 0, 0); colors[1] = cv::Scalar(0, 255, 0); colors[2] = cv::Scalar(0, 0, 255); for (size_t idx = 0; idx < contours.size(); idx++) { cv::drawContours(contourImage, contours, idx, colors[idx % 3]); } cv::imshow("Input Image", image); cvMoveWindow("Input Image", 0, 0); cv::imshow("Contours", contourImage); cvMoveWindow("Contours", 200, 0); cv::waitKey(0); return 0; }Судя по функции pointPolygonTest перед выводом изображений я могу вызвать следующее cout << pointPolygonTest(contours, Point2f(250,300), false)<<std::endlИ мне должен показаться результат либо -1, либо 0, либо 1, но у меня ничего не выходит (происходит прекращение работы программы в следствие ошибок). Подскажите, где моя ошибка, и что необходимо дописать или преобразовать чтобы у меня получилось.
  13. Работа с контурами

    Если есть возможность, не могли бы кинуть пример кода где изображение добавляется через ImplImage, контуры ищутся моим способом, и проверить какую либо координату внутри она контура или нет. Ищу уже какой день, но не нормальной документации ни примеров найти не могу. Спасибо огромное за помощь.
  14. Работа с контурами

    На сколько я понял pointPolygonTest работает с cv:Mat. а для IplImage есть что-то подобное? Или как мне использовать это в моём случае. Контур у меня ищется вот таким образом //находим контуры CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours=0; //IplImage* crugi_contur= NULL; CvSize ImageSize = cvSize(713, 713); crugi_contur = cvCreateImage(ImageSize, IPL_DEPTH_8U, 3); int contoursCont = cvFindContours( crugi, storage,&contours,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_TC89_L1, cvPoint(0,0)); // нарисуем контуры cvDrawContours( crugi_contur, contours,CV_RGB(0,255,0) ,CV_RGB(0,255,0),1, 2, CV_AA, cvPoint(0,0) ); cvShowImage("crugi_contur", crugi_contur);Уважаемые знатоки, подскажите пожалуйста.
  15. Работа с контурами

    Добрый день. Интересует следующий вопроса. Как определить входит ли определённая координата в этот контур или она за его пределами. Например в окружности стоит точка с определёнными координатами, хотелось бы узнать она внутри контура или же нет.
×