Мое решение:
Получить канал R (из RGB) - все операции, которые мы выполняем на этом канале:
Создать регион из Процент (ROI)
Пороговый канал R с минимальным значением 149 (верхнее правое изображение)
Область расширенного результата (левое среднее изображение)
Обнаружение возрастов в вычисленных роях. Дерево имеет много краев (правое среднее изображение)
Результат расширения
Эрозия с большим радиусом (нижнее левое изображение)
Выберите самый большой (по площади) объект - это область результата
ConvexHull (дерево является выпуклым многоугольником) (нижнее правое изображение )
Ограничивающий прямоугольник (справа внизу - прямоугольник)
Шаг за шагом:
Первый результат - самый простой, но не в программном обеспечении с открытым исходным кодом - «Adaptive Vision Studio + Adaptive Vision Library»: это не открытый исходный код, а действительно быстрое создание прототипа:
Весь алгоритм обнаружения рождественской елки (11 блоков ):
Следующий шаг. Мы хотим, чтобы решение с открытым исходным кодом. Измените фильтры AVL на фильтры OpenCV: здесь я сделал небольшие изменения, например. Edge Detection использует фильтр cvCanny, чтобы уважать то, что я действительно умножил изображение области с изображением ребер, чтобы выбрать самый большой элемент, который я использовал findContours + contourArea, но идея та же.
https://www.youtube.com/watch?v=sfjB3MigLH0&index=1&list=UUpSRrkMHNHiLDXgylwhWNQQ
Сейчас я не могу показать изображения с промежуточными шагами, потому что могу разместить только 2 ссылки.
Хорошо, теперь мы используем фильтры openSource, но это еще не весь открытый исходный код. Последний шаг - портирование на c ++ код. Я использовал OpenCV в версии 2.4.4
Результат финального кода на c ++:
код на c ++ также довольно короткий:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include
using namespace cv;
int main()
{
string images[6] = {"..\\1.png","..\\2.png","..\\3.png","..\\4.png","..\\5.png","..\\6.png"};
for(int i = 0; i < 6; ++i)
{
Mat img, thresholded, tdilated, tmp, tmp1;
vector channels(3);
img = imread(images[i]);
split(img, channels);
threshold( channels[2], thresholded, 149, 255, THRESH_BINARY); //prepare ROI - threshold
dilate( thresholded, tdilated, getStructuringElement( MORPH_RECT, Size(22,22) ) ); //prepare ROI - dilate
Canny( channels[2], tmp, 75, 125, 3, true ); //Canny edge detection
multiply( tmp, tdilated, tmp1 ); // set ROI
dilate( tmp1, tmp, getStructuringElement( MORPH_RECT, Size(20,16) ) ); // dilate
erode( tmp, tmp1, getStructuringElement( MORPH_RECT, Size(36,36) ) ); // erode
vector > contours, contours1(1);
vector convex;
vector hierarchy;
findContours( tmp1, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
//get element of maximum area
//int bestID = std::max_element( contours.begin(), contours.end(),
// []( const vector& A, const vector& B ) { return contourArea(A) < contourArea(B); } ) - contours.begin();
int bestID = 0;
int bestArea = contourArea( contours[0] );
for( int i = 1; i < contours.size(); ++i )
{
int area = contourArea( contours[i] );
if( area > bestArea )
{
bestArea = area;
bestID = i;
}
}
convexHull( contours[bestID], contours1[0] );
drawContours( img, contours1, 0, Scalar( 100, 100, 255 ), img.rows / 100, 8, hierarchy, 0, Point() );
imshow("image", img );
waitKey(0);
}
return 0;
}
Вы использовали -d
? Если да, то это электронное письмо предполагает, что в нем отображаются исключения, даже когда они спасены.
Следующая ошибка
Exception 'LoadError' at D:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:1112 - no such file to load -- rubygems/defaults/operating_system
Может относиться к
Я надеюсь, что это поможет. Если нет, дайте мне знать.
Вы пробовали InstantRails? У него есть rails / apache / mysql в красивом пакете, и он работал из коробки на каждом компьютере XP, который я пробовал.
Я также устанавливаю NetBeans как среду разработки и просто указываю его на двоичный файл InstantRails «bin / ruby».