Я работаю над проектом по обнаружению полосы на зеленой дорожке.Трубопровод включает этот конвейер:
- Denoise -> BGR2HSV -> HSV Filter -> Обнаружение Canny Edge -> Crop to ROI -> Обнаружение скачкообразных линий -> Технологические линии
Весь поток работает, как и ожидалось, большую часть времени на камере Raspberry Pi в реальном времени.Однако, если в кадре камеры появляется синий цвет, захват постепенно размывается (см. Ссылку GIF) и, наконец, выполнение останавливается, вызывая «Исключение с плавающей точкой».До сих пор я не мог понять причину этого, потому что это характерно для синего цвета.Я попробовал отключить алгоритм обработки линии и закончил конвейер на детекторе линии Хафа.Только что заметил эффект конвейера.Размытие продолжалось, но «Исключение с плавающей точкой» не возникало.Более того, я попытался обработать в своем Ubuntu 18.04, но на уже записанном видео.Синий цвет не вызывал никаких проблем, когда я наблюдал за процессом кадр за кадром.
Не могли бы вы помочь мне указать на проблему?Надеюсь, я смог сказать это ясно.
Вывод GDB: принят сигнал SIGFPE, арифметическое исключение.__GI_raise (sig =) на ../sysdeps/unix/sysv/linux/raise.c: НЕТ такого файла или каталога.
ps Я использую OpenCV 4.0 в C ++.
Пояснительный GIF
Исходное изображение выглядит следующим образом: ] 1 .
Искаженное изображение послесиний объект в кадре: ] 2
Параметры фильтра HSV для зеленого цвета:
- H [62,90], S [148,255], V [131,206]
Фрагмент кода:
while (true) {
timeCapture = (double) cv::getTickCount(); // capture the starting time
cap >> frame_orig;
if (frame_counter != 2){
frame_counter++;
}
else {
frame_counter = 0;
// check if the input video can be opened
if (frame_orig.empty()) {
std::cout << "!!! Input video could not be opened" << std::endl;
return -1;
}
avgCounter++; // increment the process counter
frameHeight = frame_orig.rows;
frameWidth = frame_orig.cols;
// denoise the frame using a Gaussian filter
img_denoise = lanedetector.deNoise(frame_orig);
// convert from BGR to HSV colorspace
cv::cvtColor(img_denoise, frame_HSV, cv::COLOR_BGR2HSV);
// apply color thresholding HSV range for green color
cv::inRange(frame_HSV, cv::Scalar(low_H, low_S, low_V),
cv::Scalar(high_H, high_S, high_V), frame_threshed);
// canny edge detection to the color thresholded image
// (50,200,3)
Canny(frame_threshed, frame_cannied, 133, 400, 5, true);
// copy cannied image
cv::cvtColor(frame_cannied, frame_houghP, cv::COLOR_GRAY2BGR);
// std::ofstream myfile;
// myfile.open("test.txt", std::ios_base::app);
frame_masked = lanedetector.cropROI(frame_cannied);
// runs the line detection
std::vector<cv::Vec4i> line;
HoughLinesP(frame_masked, lines_houghP, 1, CV_PI / 180, threshold,
(double) maxLineGap, (double) minLineLength);
if (!lines_houghP.empty()) {
// sort the found lines from smallest y to largest y coordinate
quickSort(lines_houghP, 0, lines_houghP.size());
// reverse the order largest y to smallest y coordinate
reverseVector(lines_houghP);
// Separate lines into left and right lines
left_right_lines = lanedetector.lineSeparation(lines_houghP,
frame_masked);
// Apply regression to obtain only one line for each side of the lane
lane = lanedetector.regression(left_right_lines, frame_threshed);
// Plot lane detection
flag_plot = lanedetector.plotLane(frame_orig, lane);
for (size_t i = 0; i < lines_houghP.size(); i++) {
cv::Vec4i l = lines_houghP[i];
if (red < 0)
red = 155;
if (green < 0)
green = 55;
cv::line(frame_houghP, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]),
cv::Scalar(255, green, red), 3, cv::LINE_AA);
red = red - 20;
green = green - 20;
}
}
// std::cout << "xTrainData (python) = " << std::endl << format(frame_houghP, Formatter::FMT_PYTHON) << std::endl << std::endl;
// calculate the process time
timeCapture = ((double) cv::getTickCount() - timeCapture)
/ cv::getTickFrequency() * 1000;
if (avgCounter == fps) {
std::cout
<< "The average process time for each 30 frames in milliseconds: "
<< (avgRunTime / fps) << std::endl;
avgCounter = 0;
avgRunTime = 0;
} else
avgRunTime += timeCapture;
//imshow(window_capture_name, frame_orig);
imshow(window_lane_detected, frame_houghP);
imshow(winodw_hsv_filtered, frame_threshed);
imshow(window_canny_applied, frame_cannied);
imshow(window_masked, frame_masked);
imshow(window_vision, frame_orig);
if (!writer.isOpened()) {
std::cout << "Could not open the output video file for write\n";
return -1;
}
writer.write(frame_orig);
red = 250;
green = 250;
char key = (char) cv::waitKey(30);
if (key == 'q' || key == 27) {
break;
}
std::cin.get();
}
}