Member 13458139 Ответов: 2

Можете ли вы сказать, что не так с этим кодом? Opencv C++ для обнаружения количества звезд.


#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/opencv.hpp"


using namespace cv;
using namespace std;


int main(int argc, char** argv)

{



	// Read image

	Mat im = imread("image1.jpg", IMREAD_GRAYSCALE);



	// Setup SimpleBlobDetector parameters.

	SimpleBlobDetector::Params params;



	// Change thresholds

	params.minThreshold = 10;

	params.maxThreshold = 200;



	// Filter by Area.

	params.filterByArea = true;

	params.minArea = 1500;



	// Filter by Circularity

	params.filterByCircularity = true;

	params.minCircularity = 0.1;



	// Filter by Convexity

	params.filterByConvexity = true;

	params.minConvexity = 0.87;



	// Filter by Inertia

	params.filterByInertia = true;

	params.minInertiaRatio = 0.01;





	// Storage for blobs

	vector<KeyPoint> keypoints;



	// Set up detector with params

	Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);



	// Detect blobs

	detector->detect(im, keypoints);


	float count_keypoints;

	count_keypoints = keypoints.size();

	cout << count_keypoints;
	cout << keypoints.size();

	waitKey(0);



}


Что я уже пробовал:

Независимо от того, что я изменю, это не даст никакого результата.

2 Ответов

Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
Mat im = imread("image1.jpg", IMREAD_GRAYSCALE);

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Мы понятия не имеем, что он должен выводить, и в любом случае не можем его запустить, поэтому вам придется узнать информацию о том, что происходит, и что он делает, чего вы не ожидали, или делает, чего вы не ожидали.

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!


Рейтинг:
0

Jochen Arndt

На этот вопрос невозможно ответить, не имея вашего образа. Я также ожидаю, что вы получите какой-то вывод типа "0.00" или ваше приложение завершится с ошибкой.

Вы должны проверить, была ли загрузка изображения успешной, потому что вы не получите результата, если это не удастся:

Mat im = imread("image1.jpg", IMREAD_GRAYSCALE);
if (!im.data)
{
    cout << "Could not open or find the image" << std::endl;
    return -1;
}
Поскольку вы передаете имя файла без пути, вы должны убедиться, что текущий каталог установлен в каталог, содержащий ваш файл изображения. Хотя я не использую параметр имени файла, я предлагаю указать полный путь.

Обратите внимание также, что возвращаемый тип vector::size является size_type (беззнаковый интегральный тип). В то время как вы могли бы назначить его float это вообще не имеет смысла и склонно к потере точности при больших размерах.

Я предлагаю включить все предупреждения (G++: - Wall, VS: /W4 в настройках проекта). Это должно показать по крайней мере два предупреждения: одно для назначения vector::size() возвращаемое значение float и один для отсутствующих return заявление в конце вашего main функция (с ограничительными опциями компилятора они также могут быть показаны как ошибки).