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

cooller51190

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

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

  • Посещение

Все публикации пользователя 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. Добрый день имеется вот такое изображение. Необходимо выделить одну мишень внутри которой поставлена мышкой точка. Точка ставиться следующим образом. #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; } Необходима возможность выделения по белому контуру чтоб выделенный контур либо скопировать либо сохранить как новое изображение. Может например просто выделить объект внутри контура с белым цветом. Подскажите как это возможно реализовать.
  3. Выделение объекта вокруг точки

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

    Добрый день, интересует как вывести на изображение значение переменной типа int. Как просто вывести любой текст на изображение знаю. CvPoint pt = cvPoint(10, 50 ); // инициализация шрифта CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA); // используя шрифт выводим на картинку текст cvPutText(img1, "TEXT", pt, &font, CV_RGB(150, 150, 150) ); // создаём окошко cvNamedWindow("img"); // показываем картинку в созданном окне cvShowImage("img", img1);Нужно вместо слова TEXT вывести значение переменной. Подскажите как это реализовать.
  16. Работа с контурами

    Добрый день. Интересует следующий вопроса. Как определить входит ли определённая координата в этот контур или она за его пределами. Например в окружности стоит точка с определёнными координатами, хотелось бы узнать она внутри контура или же нет.
  17. Есть небольшая программка поиска стрелы на изображении, хотелось бы узнать как найти её конец. После вычитания изображений, это получается первый белый пиксель с левой стороны. Необходимо найти его координату. #include "stdafx.h" #include "stdio.h" #include "cv.h" #include "highgui.h" #include "stdlib.h" #include "math.h" #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif 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, *bin=0, *dst=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 ); // получаем границы cvCanny(img1, crugi, 200, 220, 3); cvShowImage("crugi",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 ); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours=0; // находим контуры cvFindContours( strela, storage,&contours,sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); //нарисуем контуры for(CvSeq* seq0 = contours;seq0!=0;seq0 = seq0->h_next){ cvDrawContours(dst, seq0, CV_RGB(255,216,0), CV_RGB(0,0,250), 0, 1, 8); // рисуем контур } // ждём нажатия клавиши cvWaitKey(0); // освобождаем ресурсы cvReleaseImage(&img1); cvReleaseImage(&img2); cvReleaseImage(&diff); cvReleaseImage(&sub); // удаляем окна cvDestroyAllWindows(); return 0; }
  18. Поиск координат объекта (пикселя)

    Спасибо вывел все координаты белых пикселей. break в моем контексте не подходит, нужно искать минимальное значение x. Я так понимаю необходимо записывать данные в массив и искать минимальное значение. А возможно ли сразу вывести одно минимальное значение x и соответствующий ему y?
  19. Поиск координат объекта (пикселя)

    А как вывести сами координаты этой точки (значение х и у) у которой ptr[nChan*x]=255, ptr[nChan*x+1]=255 и ptr[nChan*x+2]=255?
  20. Поиск координат объекта (пикселя)

    // пробегаемся по всем пикселям изображения for( int y=0; y<strela->height; y++ ) { int nChan = strela->nChannels; // Определить количество каналов uchar* ptr = (uchar*) (strela->imageData + y * strela->widthStep); // widthStep - расстояние между соседними по вертикали точками изображения (число байт в одной строчке картинки). // Хотя это, скорее всего, число элементов (uchar) в одной строке массива данных. // Соответственно, для данного случая (при image->imageData == начало массива данных) по арифметике указателей // ptr будет указывать на начало каждой строки массива данных картинки for( int x=0; x<strela->width; x++ ) { // количество каналов вложили в nChan // пробегаемся по всем каналам каждого пикселя // конкретно здесь устанавливаются значения каналов каждого пикселя :) ptr[nChan*x] = 255; // B - синий ptr[nChan*x+1] = 255; // G - зелёный ptr[nChan*x+2] = 255; // R - красный } } Нашел вот такой способ обхода изображения. Не знаю как вывести координату, когда встречается белый пиксель. И как завершить обход когда первый белый пиксель найден. Подскажите пожалуйста уважаемые профессионалы с++. На Mat пока не перехожу, так как не смог найти толком вещей которые мне необходимы (и увы в с++ пока ещё новичок).
  21. Поиск координат объекта (пикселя)

    А не могли бы подсказать код, как это делать. Логически понимаю, а в перевод на с++ увы не знаю....Заранее благодарен
×