megabax 0 Жалоба Опубликовано December 11, 2016 Добрый день. Поделитесь, пожалуйста примерами различных детекторов особых точек на OpenCV. Я тут где-то находил вот такой пример Ши Тамаши: // OpenSVDemo.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace cv; using namespace std; /// Global variables Mat src, src_gray; int maxCorners = 23; int maxTrackbar = 100; RNG rng(12345); char* source_window = "Image"; /// Function header void goodFeaturesToTrack_Demo( int, void* ); /** * @function main */ int main( int argc, char** argv ) { /// Load source image and convert it to gray //src = imread( argv[1], 1 ); src = imread("d:\\3\\10300013.png", 1 ); cvtColor( src, src_gray, CV_BGR2GRAY ); /// Create Window namedWindow( source_window, CV_WINDOW_AUTOSIZE ); /// Create Trackbar to set the number of corners createTrackbar( "Max corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo ); imshow( source_window, src ); goodFeaturesToTrack_Demo( 0, 0 ); waitKey(0); return(0); } /** * @function goodFeaturesToTrack_Demo.cpp * @brief Apply Shi-Tomasi corner detector */ void goodFeaturesToTrack_Demo( int, void* ) { if( maxCorners < 1 ) { maxCorners = 1; } /// Parameters for Shi-Tomasi algorithm vector<Point2f> corners; double qualityLevel = 0.01; double minDistance = 10; int blockSize = 3; bool useHarrisDetector = false; double k = 0.04; /// Copy the source image Mat copy; copy = src.clone(); /// Apply corner detection goodFeaturesToTrack( src_gray, corners, maxCorners, qualityLevel, minDistance, Mat(), blockSize, useHarrisDetector, k ); /// Draw corners detected cout<<"** Number of corners detected: "<<corners.size()<<endl; int r = 4; for( int i = 0; i < corners.size(); i++ ) { circle( copy, corners[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)), -1, 8, 0 ); } /// Show what you got namedWindow( source_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, copy ); } но он почему то вылетает на строке cout<<"** Number of corners detected: "<<corners.size()<<endl; с сообщением: " ОС Windows инициировала точку останова в SpecificPoints.exe. Это может быть вызвано повреждением кучи и указывает на ошибку в SpecificPoints.exe или в одной из загруженных им DLL. Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит SpecificPoints.exe Выведенное на экран окно содержит дополнительные данные для диагностики ошибки" Подскажите пожалуйста, как лечить? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Фрукт 0 Жалоба Опубликовано December 13, 2016 Не силен в С++, но думаю что вам нужно переменную corners перевести в другой формат для вывода, например в List<Point> в джава например так и приходится делать, гонять между List<Point> (для вывода и удобной работы по сортировке) и MatOfPoint2f (для работы функций OpenCV) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Фрукт 0 Жалоба Опубликовано December 13, 2016 Вот пример из мануала: Цитата vector<Vec3f> circles; ... Draw the detected circles: for( size_t i = 0; i < circles.size(); i++ ) { Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); int radius = cvRound(circles[i][2]); // circle center circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 ); // circle outline circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 ); } Вам нужно сделать по аналогии Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано December 13, 2016 Возможно, возникла путаница в Debug|Release сборках. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах