Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Помогите составить алгоритм


Автор: dimchik19 8.5.2009, 14:52
Помогите составить  алгоритм,  как  мне определить объект на изображение которое делится по полам по горизонтали,  при помощи полу колец   и радиусов по пиксельно.   За художество прошу прощения.

Автор: Pavia 8.5.2009, 16:08
Ничего непонял что требу ется то? Определить наличие или отсутствия объекта? Тогда проверяй наличие полуколец и радиусов.

Автор: dimchik19 8.5.2009, 16:45
Цитата(Pavia @ 8.5.2009,  16:08)
Ничего непонял что требу ется то? Определить наличие или отсутствия объекта? Тогда проверяй наличие полуколец и радиусов.

Требуется к примеру загружаю BMP изображение на нем находится какой либо объект допустим самалёт нужно подсчитать сумму пикселей полуколец и радиусов в нутри самалета т .е объекта и сахронить его в базе. изображение чёрно белое.

Автор: Pavia 8.5.2009, 19:24
Код

//Выбираем дескритизацию.
//Пусть NR=50 определяет число полудуг.
//Пусть NFov=180 определяет число радиусов.

SetLength(Arcs,NR);  //Задаем размер массива дуг
h:=hypot(Width/2,Height/2);
for i:=0 to Width/2 do
 for j:=0 to Height div 2 -1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then  // Проверяем пиксель черный или нет
   begin
   Inc(Arcs[Round(hypot(i-Width/2,J-Height/2)/h*NR)],1); // Вычисляем радиус накоторой находить полу дуга и увеличиваем счетчик соответсвующего массива на 1
   end;
   
SetLength(Radius,NFov); //Задаем размер массива радиусов
h:=-Pi;
for i:=0 to Width/2 do
 for j:=Height div 2 to Height-1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then 
   begin
   Inc(Radius[Abs(Round(ArcTan2(j-Height/2,i-Width/2)/h*NFov))],1);  // Вычисляем угол накоторой повернут радиус и увеличиваем счетчик соответсвующего массива на 1 ABS () Для перестраховки. 
   end;



Можно и точнее. Перебираешь не точки и радиусы и углы и проверяешь цвет точки в пикселе.

Добавлено через 4 минуты и 20 секунд
Код

//Выбираем дескритизацию.
//Пусть NR=50 определяет число полудуг.
//Пусть NFov=180 определяет число радиусов.

SetLength(Arcs,NR);  //Задаем размер массива дуг
h:=hypot(Width/2,Height/2);
for i:=0 to Width/2 do
 for j:=0 to Height div 2 -1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then  // Проверяем пиксель черный или нет
   begin
   Inc(Arcs[Round(hypot(i-Width/2,J-Height/2)/h*NR)],1); // Вычисляем радиус накоторой находить полу дуга и увеличиваем счетчик соответсвующего массива на 1
   end;
   
SetLength(Radius,NFov); //Задаем размер массива радиусов
h:=-Pi;
for i:=0 to Width/2 do
 for j:=Height div 2 to Height-1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then 
   begin
   Inc(Radius[Abs(Round(ArcTan2(j-Height/2,i-Width/2)/h*NFov))],1);  // Вычисляем угол накоторой повернут радиус и увеличиваем счетчик соответсвующего массива на 1 ABS () Для перестраховки. 
   end;



Можно и точнее. Перебираешь не точки и радиусы и углы и проверяешь цвет точки в пикселе.

Автор: dimchik19 8.5.2009, 20:46
Цитата(Pavia @ 8.5.2009,  19:24)
Код

//Выбираем дескритизацию.
//Пусть NR=50 определяет число полудуг.
//Пусть NFov=180 определяет число радиусов.

SetLength(Arcs,NR);  //Задаем размер массива дуг
h:=hypot(Width/2,Height/2);
for i:=0 to Width/2 do
 for j:=0 to Height div 2 -1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then  // Проверяем пиксель черный или нет
   begin
   Inc(Arcs[Round(hypot(i-Width/2,J-Height/2)/h*NR)],1); // Вычисляем радиус накоторой находить полу дуга и увеличиваем счетчик соответсвующего массива на 1
   end;
   
SetLength(Radius,NFov); //Задаем размер массива радиусов
h:=-Pi;
for i:=0 to Width/2 do
 for j:=Height div 2 to Height-1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then 
   begin
   Inc(Radius[Abs(Round(ArcTan2(j-Height/2,i-Width/2)/h*NFov))],1);  // Вычисляем угол накоторой повернут радиус и увеличиваем счетчик соответсвующего массива на 1 ABS () Для перестраховки. 
   end;



Можно и точнее. Перебираешь не точки и радиусы и углы и проверяешь цвет точки в пикселе.

Добавлено @ 19:28
Код

//Выбираем дескритизацию.
//Пусть NR=50 определяет число полудуг.
//Пусть NFov=180 определяет число радиусов.

SetLength(Arcs,NR);  //Задаем размер массива дуг
h:=hypot(Width/2,Height/2);
for i:=0 to Width/2 do
 for j:=0 to Height div 2 -1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then  // Проверяем пиксель черный или нет
   begin
   Inc(Arcs[Round(hypot(i-Width/2,J-Height/2)/h*NR)],1); // Вычисляем радиус накоторой находить полу дуга и увеличиваем счетчик соответсвующего массива на 1
   end;
   
SetLength(Radius,NFov); //Задаем размер массива радиусов
h:=-Pi;
for i:=0 to Width/2 do
 for j:=Height div 2 to Height-1 do
  if bp.Canvas.Pixel[i,j]=ClBlack then 
   begin
   Inc(Radius[Abs(Round(ArcTan2(j-Height/2,i-Width/2)/h*NFov))],1);  // Вычисляем угол накоторой повернут радиус и увеличиваем счетчик соответсвующего массива на 1 ABS () Для перестраховки. 
   end;



Можно и точнее. Перебираешь не точки и радиусы и углы и проверяешь цвет точки в пикселе.

Спасибо а можно это както перевести на С++ Builder или visual

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)