<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=455358&amp;view=findpost&amp;p=3915860</guid>
        <pubDate>Tue, 07 Jan 2025 15:09:20 +0000</pubDate>
        <title>Алгоритм поиска прямоугольников в bmp</title>
        <link>https://forum.sources.ru/index.php?showtopic=455358&amp;view=findpost&amp;p=3915860</link>
        <description><![CDATA[Pcrepair: Добрый день. Есть задача поиска прямоугольников в BMP файле со следующими параметрами:<br>
1) исходный файл черно-белый (белый цвет значащий), разрядность 1-бит<br>
2) размер файла 1920х1031 пиксель, но это не принципиально, размеры могут быть всякие<br>
3) фигуры внутри файла могут быть всякие, но это не принципиально, нужны только прямоугольники, даже если сложная фигура будет определена как прямоугольник значения не имеет<br>
<br>
текущий код позволяет найти координаты прямоугольников те что справа после первого найденного прямоугольники<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TMain.Button1Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;rLeft, rTop, rRigth, rBottom, rMinH, rMinW: Integer;</div><div class="code_line">&nbsp;&nbsp;glBitMap: Vcl.Graphics.TBitmap;</div><div class="code_line">&nbsp;&nbsp;rRestsList: string;</div><div class="code_line">begin &nbsp;// запуск процесса поиска</div><div class="code_line">&nbsp;&nbsp;glBitMap := TBitmap.Create;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;if FindRects(glBitMap, rRestsList) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Memo1.Lines.Add(rRestsList);</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;FreeAndNil(glBitMap);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">(* 2024.12.21 to find all exseptable rectigies coordinates in bmp *)</div><div class="code_line">function FindRects(const aBitmap: Vcl.Graphics.TBitmap; var aRestsList: string): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;H, W, hStart, wStart: Integer;</div><div class="code_line">&nbsp;&nbsp;stFlg: Boolean;</div><div class="code_line">&nbsp;&nbsp;Clr, aLeft, aTop, aRigth, aBottom: Integer;</div><div class="code_line">&nbsp;&nbsp;RestsList: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := false;</div><div class="code_line">&nbsp;&nbsp;hStart := 0; &nbsp;// установка поиска в начало координат файл.БМП</div><div class="code_line">&nbsp;&nbsp;wStart := 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;repeat // повтор поиска</div><div class="code_line">&nbsp;&nbsp; &nbsp;stFlg := false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// функция DefineRectCoo возвращает ДА и координаты лево-верх-справа-низ ПЕРВОГО! найденного прямоугольника в файл.БМП</div><div class="code_line">&nbsp;&nbsp; &nbsp;if DefineRectCoo(aBitmap, hStart, wStart, aLeft, aTop, aRigth, aBottom) then &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;(* send data to output *) &nbsp;//сбор координат найденных прямоугольников</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Insert((IntToStr(aLeft) + &#39;:&#39; + IntToStr(aTop) + &#39;:&#39; + IntToStr(aRigth) + &#39;:&#39; + IntToStr(aBottom) +</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sLineBreak), aRestsList, (aRestsList.Length + 1));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;(* ---------------------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;stFlg := true; //запуск повторного поиска</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;(* next rigth-top rect *)</div><div class="code_line">&nbsp;&nbsp; &nbsp;hStart := aTop; wStart := aRigth + 1; &nbsp;//поиск из новой начальной точки: верх-справа от найденного прямоугольника</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;until (stFlg = false);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (aRestsList.Length &#62; 0) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := true;</div><div class="code_line">end;</div><div class="code_line">(* -------------------------------------------- *)</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
все почти хорошо, но определяюттся только координаты всех прямоугольников которые справа от найденного hStart := aTop; wStart := aRigth + 1; никак не придумаю алгоритм для поиска всех прямоугольников<br>
file.bmp входной файл<br>
data.bmp результат поиска<br>
<br>
вопрос: может кто что подскажет по алгоритму?<br>
<br>
Заранее спасибо за ответы по ЗАДАННЫМ вопросам<br>
<span class="b-attach" data-size="1198" data-hits="83" data-attach-id="66712" data-attach-post-id="3915860">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3915860&amp;attach_id=66712' title='Скачать файл' target='_blank'>data.zip</a> (, : 83)
		</span><br>
<span class="b-attach" data-size="2069" data-hits="78" data-attach-id="66713" data-attach-post-id="3915860">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3915860&amp;attach_id=66713' title='Скачать файл' target='_blank'>file.zip</a> (, : 78)
		</span>]]></description>
        <author>Pcrepair</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	