7 segment digits検出のためのテンプレート準備

#2 連続処理

前のプログラムにframe0.jpg~frame9.jpgの範囲で繰り返す処理を加えます。前の記事は、

でした。

前のプログラムを活用します。まずフォームから、

Unit1.hは、

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TImage *Image1;
	TOpenDialog *OpenDialog1;
	TButton *AddRect;
	TImage *Image2;
	TButton *Auto;
	void __fastcall FormDestroy(TObject *Sender);
	void __fastcall Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y);
	void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
	void __fastcall Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y);
	void __fastcall FormPaint(TObject *Sender);
	//void __fastcall OpenClick(TObject *Sender);
	void __fastcall AddRectClick(TObject *Sender);
	//void __fastcall SaveClick(TObject *Sender);
	void __fastcall AutoClick(TObject *Sender);

private:	// ユーザー宣言
    bool FDrawing;     // ドラッグ中かどうかのフラグ
    TPoint FStartPos;  // マウスを押し下げた初期座標
	TPoint FLastPos;   // 直前のマウス座標(線を消す用)
    TPoint FEndPos;
	TBitmap *FBkBmp;   // 背景画像を一時保存するビットマップ

public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cppは、

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <jpeg.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TRect absarea;
int width;
int height;
int vheight;

void LoadJpegFile(const AnsiString & Src,
							Graphics::TBitmap * Bitmap)
{
		TJPEGImage * Jpeg = new TJPEGImage();

	Jpeg->Performance = jpBestQuality;
		Jpeg->PixelFormat = jf24Bit;
		Jpeg->Grayscale = false;
		Jpeg->LoadFromFile(Src);

		Bitmap->HandleType = bmDIB;
		Bitmap->PixelFormat = pf32bit;
		Bitmap->Width = Jpeg->Width;
		width = Jpeg->Width;
		Bitmap->Height = Jpeg->Height;
		height = Jpeg->Height;
		Bitmap->Canvas->Draw(0,0,Jpeg);

		vheight = 640* height / width ;

		delete Jpeg;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
		FDrawing = false;
		FBkBmp = new TBitmap();

		LoadJpegFile("frame0.jpg",FBkBmp);
		//Image1->Canvas->Draw(0,0,FBkBmp);
		TRect dest = {0,0,640,vheight};

		Image1->Height = vheight;
		Image1->Width = 640;

		//Image1->Canvas->Draw(dest,FBkBmp);
		Image1->Canvas->StretchDraw(dest,FBkBmp);
		//Canvas->StretchDraw()


}


//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
	 delete FBkBmp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
		  int X, int Y)
{
	if (Button == mbLeft) // 左クリックのみ対象
	{
		FDrawing = true;
		FStartPos = Point(X, Y);
		FLastPos = Point(X, Y);

        // 現在の Image1 の状態(背景)を FBkBmp にコピーして保存
        FBkBmp->Assign(Image1->Picture->Bitmap);
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
     if (FDrawing)
    {
        // 毎回バックアップから背景を書き戻す(古いドラッグ枠を消すため)
        Image1->Picture->Bitmap->Assign(FBkBmp);

        // 描画設定
        Image1->Canvas->Pen->Color = clRed;
        Image1->Canvas->Pen->Width = 1;
        Image1->Canvas->Brush->Style = bsClear; // 中は透明

        // 開始位置から現在のカーソル位置まで四角形を描画
        Image1->Canvas->Rectangle(FStartPos.x, FStartPos.y, X, Y);

		// 画面更新

		FEndPos.x = X;
		FEndPos.y = Y;

        Image1->Refresh();
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    if (Button == mbLeft && FDrawing)
    {
        FDrawing = false; // ドラッグ終了

        // 最後に確定した図形を描画
        Image1->Canvas->Pen->Color = clRed;
        Image1->Canvas->Pen->Width = 1;
        Image1->Canvas->Brush->Style = bsClear;
        Image1->Canvas->Rectangle(FStartPos.x, FStartPos.y, X, Y);

        Image1->Refresh();
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
		//Graphics::TBitmap * Bitmap = new Graphics::TBitmap();
		//LoadJpegFile("IMG_0201.JPG",Bitmap);
		//Image1->Canvas->Draw(0,0,Bitmap);
		//delete Bitmap;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

void __fastcall TForm1::AddRectClick(TObject *Sender)
{
	TRect area = { FStartPos.X+1,FStartPos.Y+1,FEndPos.X-1,FEndPos.Y-1};

	int	width2 = area.Width();
	int	height2 = area.Height();

	Image2->Width = width2;
	Image2->Height = height2;


	TRect dst = {0,0,Image2->Width,Image2->Height};

	Image2->Canvas->CopyRect(dst, Image1->Canvas, area);

	absarea = area;
}
//---------------------------------------------------------------------------

/*
void __fastcall TForm1::SaveClick(TObject *Sender)
{
	Image2->Picture->SaveToFile("output.png");
}
*/

//---------------------------------------------------------------------------

void __fastcall TForm1::AutoClick(TObject *Sender)
{
	//loop through 1 to 9
	String outfilename = "frame0.png";
	Image2->Picture->SaveToFile(outfilename);

	for( int frame = 1 ; frame < 10 ; frame++ ){
		String filename = "frame" + IntToStr(frame) + ".jpg";
		outfilename = "frame"+ IntToStr(frame) + ".png";

		FBkBmp = new TBitmap();

		LoadJpegFile(filename,FBkBmp);

		TRect dest = {0,0,640,vheight};

		Image1->Height = vheight;
		Image1->Width = 640;

		TRect dst = {0,0,Image2->Width,Image2->Height};
		Image1->Canvas->StretchDraw(dest,FBkBmp);
		Image2->Canvas->CopyRect(dst, Image1->Canvas, absarea);
		Image2->Picture->SaveToFile(outfilename);

	}

}
//---------------------------------------------------------------------------

開始時、

マウスで領域をドラッグして、AddRect

Autoをクリックして、終了時は、

出来たテンプレート画像は、frame0.pngが、

frame9.pngが、

です。個々のファイルはまだ24bit pngです。

コメント