ブルベリー 網掛け (4)

網掛けがおわりました。以前のものに比べて,かなりしっかりした作りにできました。



あとは,耐久性で,どのくらいもつかですね。
イレクターパイプには,プラスチックジョイントとメタルジョイントがありますが,純正のメタルジョイント
は結構高いです。パイプは純正のものを使うしかありませんが,メタルジョイントをつかうなら,互換品を使
う方がいいかもですね。

 HJ-1 S —408円(amazon)純正
      150円(amazon)NTY

ただ,互換品については,品質等は?かも。今回の作成にあたって,両方を使いました。NTYの他にスペーシ
アというメーカーもあるようですね。ジョインとは,スペーシアブランドをつかいました。

ブルベリー 網掛け (3)

イレクターパイプのカタログに,外形寸法から,パイプの長さを求める式がのっています。それによると,

 -33mm ジョイントの端からパイプの芯まで 16.5mm×2(両端)
 -70mm パイプの芯からパイプインナーキャップ先端まで 35mm×2(両端)
 -6mm  ジョイントの厚み 3mm×2(両端)

の記述があり,今回の外形は,1980mm の予定ですので,パイプの長さは,

 1980mm-33mm-70mm-6mm=1871mm(使うパイプの長さ)

 2000mm-1871mm=129mm (カットする長さ)

になります。屋根部分は,4本使いますので,約130mmの端材が4本できます。もったいないので,
この130mmの端材を継ぎ足しでつかいました。

 2000mm+130mm=2130mm

の高さのものができます。縦のポールは8本使うので,4本端材がたりませんので,別途450mm
のパイプから約90mmのものを4本きりだしました。130mmでないのは,4本は,プロスティック
ジョイントをするため,必要な長さが違ってくるからです。



屋根部分を組み立ててから,片方ずつ,足をはめ込み,たちあげました。



立ち上げてから,移動し,筋交い部品や,横の補強用パイプを取り付け,接合部分には,自己融着テープ
で防水しました。


合計,八カ所,テープをまきました。



ほぼ完成なのですが,メタルパイプの接合部分のキャップが届いてないので,届き次第施工です。明日は,網
をかけます。

ブルベリー 網掛け (2)

なるべく端材をださないように,継ぎ足して使う用にします。そのために,だいたいの長さをそろえます。切
る段階で2から4mm程度ばらつきがありましたので,デスクグラインダーで削りました。



それほど厳密にならなくてもいいように思いますが,気持ちそろえました。また,パイプがっくろなので,墨
線の黒が目立たないので,今回は,ガムテープをまいて,切ってみました。



これが良かったのか,墨線の手前に刃を合わせて,一周させると,ちょうど刃が墨線を切るようになって,そ
れほど誤差無く,切断できるようになりました。



でも,やはり,このパイプカッターは,切れ味がいまいちのようです。

ブルベリー 網掛け (1)

我が家の庭にブルーベリーの木があり,毎年結構な実をつけてくれてます。



時期になると,鳥さんが,えさにするのにあつまるようになります。それを防ぐのに毎年網をかけてます。市
販の温室用のフレームを利用していますが,ちょっと小さいのと,安定感がないというので,作り直すことに
しました。
作るにあたって,いろいろ検討しましたが,なかなか適当なものがなくて,結局イレクターパイプで作ること
にしました。
なるべく加工をしないで,組み立てようとおもいましたが,ジョイントの分大きさが大きくなりますので,外
枠の寸法に合わせて,パイプを詰める必要があります。
パイプを切るには,パイプカッターを使いますが,純正のものは,約5600円オーバーと高いので,
バリ取りもついているのでamazonで安いもを購入しました。



約半額でした。ただ,どうなんでしょう,実際に使ってみると,使い方が悪いのか,切断面に引いた墨線上で
うまくきれず,一回転すると,2から3mm程度ずれてしまいます。高い,純正のものはどうなんでしょうか,
ずれないできれるのでしょうかね。なんか切れ味もいまいちのようなきもしますが,何回か切るうちに,思っ
たところで,切れるようになるといいのですが・・・・・・・。

python 事始め (8) 画像の回転 第4弾

いくつか改良を加えました。大きな改良は,左ボタンをを押したままにすると,動作?が続くようにしたこと
です。いままでは,一端ボタンを離して再びクリックしないと,同じ動作の繰り返しができませんでしたが,
改良いたしました。ある方のプログラムをおかりしてます。考え方としては,PICでよく使った割り込み処理
と同じ方法のようです。

クリックである動作(一回実施)
ボタンを離すとある動作

の動作は比較的簡単にできるのですが,

クリックである動作を続ける(クリックされている間繰り返して行う)
ボタンを離すと上記の動作をやめる。

ができなかったので大助かりでした。
それと,一定の角度の開きで回転する部分を,開き方を調整できるようにしたこと,回転角度を指定できるよ
うにしたことです。
これで,表示部分は,ほぼ完成ですが,「回転」→→「開く」の切り替え時に,がうまくいかないのが課題で
どうしようかと思案してます。

以下が,プログラムの全文です。

# ライブラリのインポート
import cv2

#import tkinter as tk
#impor tk.filedialog, tk.messagebox
import tkinter, tkinter.filedialog, tkinter.messagebox
from PIL import Image, ImageTk
import os
import matplotlib.pyplot as plt
import numpy as np
import time

dt=100 # millisecond

class SpecialButton(tkinter.Button):

	#def activate_press_and_release(self):
	def __init__(self,*args,**kwargs):
		#tk.Button.__init__(self,*args,**kwargs)
		tkinter.Button.__init__(self,*args,**kwargs)
		self._is_pressed = False
		self.bind('',self.pressed)
		self.bind('',self.released)

	def pressed(self,value):
		self._is_pressed = True

	def released(self,value):
		self._is_pressed = False

# ファイル名を配列に格納
file_names = ['00.jpg', '01.jpg', '02.jpg','03.jpg','04.jpg','05.jpg','06.jpg','07.jpg','08.jpg','09.jpg','10.jpg',\
		'11.jpg','12.jpg','13.jpg','14.jpg','15.jpg','16.jpg','17.jpg','18.jpg','19.jpg','20.jpg','21.jpg',\
		'22.jpg','23.jpg','24.jpg','25.jpg','26.jpg','27.jpg','28.jpg','29.jpg','30.jpg','31.jpg','32.jpg',\
		'33.jpg','34.jpg','35.jpg','36.jpg','37.jpg','38.jpg','39.jpg','40.jpg','41.jpg','42.jpg','43.jpg',\
		'44.jpg','45.jpg','46.jpg','47.jpg','48.jpg','49.jpg','50.jpg','51.jpg','52.jpg','53.jpg','54.jpg',\
		'55.jpg','56.jpg','57.jpg','58.jpg','59.jpg','60.jpg','61.jpg','62.jpg','63.jpg','64.jpg','65.jpg']
file_names1 = [ '0.jpg', '1.jpg', '2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg','9.jpg','10.jpg',\
		'11.jpg','12.jpg','13.jpg','14.jpg','15.jpg','16.jpg','17.jpg','18.jpg','19.jpg','20.jpg','21.jpg',\
		'22.jpg','23.jpg','24.jpg','25.jpg','26.jpg','27.jpg','28.jpg','29.jpg','30.jpg','31.jpg','32.jpg',\
		'33.jpg','34.jpg','35.jpg','36.jpg','37.jpg','38.jpg','39.jpg','40.jpg','41.jpg','42.jpg','43.jpg',\
		'44.jpg','45.jpg','46.jpg','47.jpg','48.jpg','49.jpg','50.jpg','51.jpg','52.jpg','53.jpg','54.jpg',\
		'55.jpg','56.jpg','57.jpg','58.jpg','59.jpg','60.jpg']

#グローバル変数の定期
img=file_names[0]
kaisu=0
kaisu1=0
gazou=""
img1=""
revers=0
kaiten_deg=0
kaiten_ang=0
cw_f=0
ccw_f=0
button_f=0
dt=100

imagetk_list = list()

# ベースパスを設定
base_path = 'E:/python-kaihatu/nanikana/mask-jp'
base_path1 = 'E:/python-kaihatu/nanikana/mask-r1'

# tkオブジェクトの作成
root = tkinter.Tk()
root.title("なにかな") #ウィンドウのタイトルを設定
root.geometry("700x570") #ウィンドウのサイズを設定

### キャンバス作成
canvas=tkinter.Canvas(root,width=550, height=550)
canvas.place(x = 10,y = 10)

#背景画像を読み込み
gazou= cv2.imread('E:/python-kaihatu/nanikana/gazou/isu.jpg')

def gazou_over():
	global kaisu,gazou

	# 「フルパス+ファイル名」を作成
	full_path = os.path.join(base_path, file_names[kaisu])

	# マスクファイルを開く
	mask = cv2.imread(full_path)

	if mask is not None:
		#画像の合成
		result = cv2.bitwise_and(mask,gazou)
		#BRG読み込みをRGBに変換
		result = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
		#フォーマットをPILに変換
		result = Image.fromarray(result)
	return result

def kaiten_mr():
	global result1,mask,kaiten_deg,kaiten_ang
	# フルパスを作成
	full_path = os.path.join(base_path,file_names[kaisu1] )

	# マスクファイルを開く
	mask = cv2.imread(full_path)

	#マスク画像の回転
	#	高さ・幅・回転の中心定義
	height = mask.shape[0]                         
	width =  mask.shape[1]                            
	center = (int(width/2), int(height/2))

	angle = kaiten_deg*kaiten_ang*(-1)
	scale=1.0
	trans = cv2.getRotationMatrix2D(center, angle , scale)
	mask = cv2.warpAffine(mask, trans, (width,height), borderMode=cv2.BORDER_CONSTANT, borderValue=(255, 255, 255))

	#画像の合成
	result1 = cv2.bitwise_and(mask,gazou)

	#BRG読み込みをRGBに変換
	result1= cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)

	#フォーマットをPILに変換
	result1 = Image.fromarray(result1)
	
	#TkinterのPhotoImageに変換
	result1=ImageTk.PhotoImage(result1)

	canvas.create_image(273,273,image = result1,tag='p1')

def kaiten():
	global result1,mask
	# フルパスを作成
	full_path1 = os.path.join(base_path1, file_names1[kaisu1])

	# マスクファイルを開く
	mask = cv2.imread(full_path1)
	
	#画像の合成
	result1 = cv2.bitwise_and(mask,gazou)

	#cv2.imshow('test', result)

	#BRG読み込みをRGBに変換
	result1= cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)

	#フォーマットをPILに変換
	result1 = Image.fromarray(result1)
	
	#TkinterのPhotoImageに変換
	result1=ImageTk.PhotoImage(result1)

	canvas.create_image(273,273,image = result1,tag='p1')

#クリック動作
def on_button_click():
	global kaisu,imagetk_list,button_f
	button_f=1

	if  kaisu<65:
		kaisu= kaisu+1

		#旧画像の削除
		canvas.delete('p1')

		result= gazou_over()
		result=ImageTk.PhotoImage(result)
		imagetk_list.append(result)
		canvas.create_image(273,273,image = result,tag='p1')

def on_button1_click():
	global kaisu,imagetk_list,button_f

	if  kaisu>0:
		kaisu= kaisu-1

		#旧画像の削除
		canvas.delete('p1')

		result= gazou_over()
		result=ImageTk.PhotoImage(result)
		imagetk_list.append(result)
		canvas.create_image(273,273,image = result,tag='p1')
	

def on_button2_click():
	global kaisu1,kaiten_deg,cw_f,ccw_f,kaiten_ang

	kaisu1=int(textbox1.get())
	kaiten_ang=int(textbox2.get())

	cw_f=1#時計回り回転
	
	if ccw_f==1:
		ccw_f=0
		kaiten_deg=kaiten_deg+2
			
	if kaiten_deg==0:
		kaiten_mr()
		kaiten_deg=kaiten_deg+1
	
	else:
		kaiten_mr()
		kaiten_deg=kaiten_deg+1


def on_button3_click():
	global kaisu1,kaiten_deg,cw_f,ccw_f,kaiten_ang

	kaisu1=int(textbox1.get())
	kaiten_ang=int(textbox2.get())


	ccw_f=1#逆時計回り回転

	if cw_f==1:
		cw_f=0
		kaiten_deg=kaiten_deg-2
	
	if kaiten_deg==0:
		kaiten_deg=kaiten_deg-1
		kaiten_mr()
		kaiten_deg=kaiten_deg-1

	else:
		kaiten_mr()
		kaiten_deg=kaiten_deg-1

def on_button4_click():
	global gazou

	fTyp = [("","*")]
	#iDir = os.path.abspath(os.path.dirname(__file__))
	iDir='E:/python-kaihatu/nanikana/gazou/'
	tkinter.messagebox.showinfo('なにかな','処理ファイルを選択してください!')
	file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

	# 処理ファイル名の出力
	#tkinter.messagebox.showinfo('なにかな',file)

	if file=="":
		gazou=cv2.imread('E:/python-kaihatu/nanikana/gazou/isu.jpg')
		
	else:
		gazou=cv2.imread(file)

	img_pil=gazou_over()
	img_pil=ImageTk.PhotoImage(img_pil)
	#画像ファイルをキャンバスの(0,0)に合わせて表示してみる
	canvas.create_image(273,273,image = img_pil,tag='p1')

def on_button5_click():
	global kaisu1,kaiten_deg

	kaisu1=4

	kaiten_mr()

	kaiten_deg=kaiten_deg+1


def callback():
	global root,button1,button2

	if button._is_pressed:
		on_button_click()
	if button1._is_pressed:
		on_button1_click()
	if button2._is_pressed:
		on_button2_click()
	if button3._is_pressed:
		on_button3_click()
	time.sleep(0.05)
	root.after(dt,callback)


#PILでjpgを使用
img_pil=gazou_over()
img_pil=ImageTk.PhotoImage(img_pil)
#画像ファイルをキャンバスの(0,0)に合わせて表示してみる
canvas.create_image(273,273,image = img_pil,tag='p1')

# ウィジェットの配置や、イベント処理などを記述
textbox1 = tkinter.Entry(root,width=3)
textbox1.place(x=635, y=230)
textbox1.insert(0,"4")
textbox2 = tkinter.Entry(root,width=3)
textbox2.place(x=635, y=250)
textbox2.insert(0,"5")

#button = tkinter.Button(root, text="cw開く", bg="cyan4", fg="white",width=8, height=1,)
button = SpecialButton(text="cw開く", bg="cyan4", fg="white",width=8, height=1,)
button.place(x=595, y=30)

button1 = SpecialButton(text="ccw閉じる", command=on_button1_click, bg="cyan4", fg="white",width=8, height=1)
button1.place(x=595, y=60)

button2 = SpecialButton(text="回転", command=on_button2_click, bg="cyan4", fg="white",width=8, height=1)
button2.place(x=595, y=170)

button3 = SpecialButton(text="逆回転", command=on_button3_click, bg="cyan4", fg="white",width=8, height=1)
button3.place(x=595, y=200)

button4 = tkinter.Button(root,text="ファイル", command=on_button4_click, bg="cyan4", fg="white",width=8, height=1)
button4.place(x=595, y=400)


# メインループの実行
#root = tkinter.Tk()
root.after(dt,callback)
root.mainloop()

今回の目玉は,tkinter.Button の代わりに諸兄の作られた SpecialButton のを使ったことと,下記の
callback()
関数を使ったことです。この関数は,一定時間間隔で,自分自身を呼び出す,「再帰」を使っていることで
す。今回のプログラムを考えるにあたって,左ボタンのチェックを,無限ループのなかで,チェックして,
フラグによって,ループを抜ける方法もやってみましたが,うまく動作しませんでした。またしても,諸兄
に助けられました,それにしても,すごい方がいるもんです。

def callback():
	global root,button1,button2

	if button._is_pressed:
		on_button_click()
	if button1._is_pressed:
		on_button1_click()
	if button2._is_pressed:
		on_button2_click()
	if button3._is_pressed:
		on_button3_click()
	time.sleep(0.05)
	root.after(dt,callback)

どうやら 詐欺サイト(アトリエ絵利奈)に 捕まりました。ーーその後

サイト名に使われている,「万田酵素」に連絡したところ,警察に通報するとのことでした。しばらくぶり
に本日,例のサイトにアクセスしてみたところ,サイトがなくなっていました。
また,ビットキャストの会社には,使ったカード番号等を連絡しましたが,まあ,音沙汰なしでした。

どうも,この詐欺サイトは,どうもしつこいようで,下記のようなメールもどときましした。

差出人  中田智哉<tnpbdi@mfrank.shop>
題 名  【重要】※受注返金メールについて※
本 文

*** *** 様、よろしくお願いします

※このメールはお客様の注文に関する大切なメールです。
必ず内容をご確認下さい。
——————————————————
先日は当店をご利用いただき誠にありがとうございます。

ご注文いただきました商品についてですが、
先日ご購入頂いた商品は、現在一時的に欠品しております。
代わりを受け入れていただけますか?
せっかくご注文いただきましたところ大変申し訳ございません。

——————————————————
大変恐れ入りますが、下記のご注文をキャンセルさせていただきます。
商品の交換をご希望の場合は、弊社の公式LINEまでご連絡ください
※公式LINE(ID) :hu76k5
https://line.me/ti/p/FQbG_4cY**
(一部伏せてます)
我々は同等のタイプのより良い品質のを提供して、あなたはいかなる差額を支払う必要はあり
ません。
——————————————————
ご注文番号: 785294
ご注文日: 2025年03月04日(Tue)
● ご注文商品
******************************************************
1 x ※※※※※※(注文した本の題名) (Z8324913485) = 1,950円(税込)
*******************************************************
小計: 1,950円(税込)
配送料無料オプション (配送料無料): 0円(税込)
合計: 1,950円(税込)

● お届け先住所*
*******************************************************
日本,※※※市
※※※町 ****-**
***-****←←郵便番号
※※ ※※←←私の名前
—————————————————–
お返金の手続きは弊社の公式LINEまでご連絡をお願い致します。
ご希望の場合は返金いたします。
このメールに返信をお願いします。あるいはLINEのサポートに連絡します
できるだけ早く返金いたします。
大変恐れ入りますが,当店をご利用いただき誠にありがとうございます。
——————————————————
※商品問題確認メール牡蠣口商社モロ電商事

おまけに,ラインのQRコードまで,添付されてます。どうやら,LINEを使って,なにか悪巧み企て
ているようです。
よく見てみると,このメールも突っ込みどころ満載です。まず,注文したのが,本ですから,代替え品は
あり得ないこと。会社名が,注文した会社とは違っているところ。ラインへの登録を求めること等など,
もちろん,ラインには登録するはずもなく,ちょと,いたずらで,迷惑メールを何通か送ってあげました。

どうやら 詐欺サイト(アトリエ絵利奈)に 捕まりました。

YouTubeで,たまたま見かけが本の紹介。久しぶりに読んでみたくなりましたので,早速検索。しかし新品は
高い。ということで,古本(中古)探しました。たまたま,「アトリエ絵利奈」という,サイトに1950円,
とありましたので,早速注文。注文にあたり,楽天店の表示があるにも関わらず,楽天モールとは別のとこ
ろにあります。それに,支払いが,ビットキャッシュというプリペイドカードです。

この段階で,気付けばよかったのですが,支払いをしてしまいました。支払いにさいして,何度か同じ物を
注文してしまったので,電話にて,取り消してもらおうと,電話をかけましたが,現在つかわれていません
の応答です。ここで,やっと詐欺にあったときづきました。これが,クレジットカードだけとか,いうので
したら,警戒しましたが,今回は警戒をしませんでした。自分の安く買いたいという「欲」にまけてしまい
ました。このサイトのおかしい所は,
 楽天とあるのに楽天モール外に設置
 支払いがビットキャッシュというプリペイドカード(楽天モールでは多分ない)
 メール返信の文面にやや不自然なところがある→(ご理解とご協力ありがとうございます)
 住所の記載に,県名の記載(項目)がなく「日本」だった
これらのことから,外国(k国)等のサイトだったのかなと思います。
それにしても,うまくできたサイトです。1950円,また大きな勉強代になりました。
–追記
同じような過ちを防ぐため,この偽サイトの情報を掲載いたします。URLは,

ttps://indxsq.megrok.ru.com/

です。不要なアクセスを防ぐため,最初の「 h 」は省いています。会社情報に記載されている,電話番号は,
神奈川県横浜市(携帯の履歴より)のもののようです。住所は広島なのにあり得ないですね。
それと,会社概要にでている,販売会社が,「万田発酵株式会社」になってます。

下記がホームページのトップです。

品物を見てみると,

のように,値段に小数点がついてます。日本のサイトなら,ありえないですね。

python 事始め (7) 画像の回転 第3弾

ちょっと時間がかかりましたが,回転の部分を組み込みました。

下記がプログラム,全文です。

 ライブラリのインポート
import cv2
import tkinter as tk
from PIL import Image, ImageTk
import os
import matplotlib.pyplot as plt
import numpy as np

# ファイル名を配列に格納
file_names = ['00.jpg', '01.jpg', '02.jpg','03.jpg','04.jpg','05.jpg','06.jpg','07.jpg','08.jpg','09.jpg','10.jpg',\
		'11.jpg','12.jpg','13.jpg','14.jpg','15.jpg','16.jpg','17.jpg','18.jpg','19.jpg','20.jpg','21.jpg',\
		'22.jpg','23.jpg','24.jpg','25.jpg','26.jpg','27.jpg','28.jpg','29.jpg','30.jpg','31.jpg','32.jpg',\
		'33.jpg','34.jpg','35.jpg','36.jpg','37.jpg','38.jpg','39.jpg','40.jpg','41.jpg','42.jpg','43.jpg',\
		'44.jpg','45.jpg','46.jpg','47.jpg','48.jpg','49.jpg','50.jpg','51.jpg','52.jpg','53.jpg','54.jpg',\
		'55.jpg','56.jpg','57.jpg','58.jpg','59.jpg','60.jpg','61.jpg','62.jpg','63.jpg','64.jpg','65.jpg']
file_names1 = [ '0.jpg', '1.jpg', '2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg','9.jpg','10.jpg',\
		'11.jpg','12.jpg','13.jpg','14.jpg','15.jpg','16.jpg','17.jpg','18.jpg','19.jpg','20.jpg','21.jpg',\
		'22.jpg','23.jpg','24.jpg','25.jpg','26.jpg','27.jpg','28.jpg','29.jpg','30.jpg','31.jpg','32.jpg',\
		'33.jpg','34.jpg','35.jpg','36.jpg','37.jpg','38.jpg','39.jpg','40.jpg','41.jpg','42.jpg','43.jpg',\
		'44.jpg','45.jpg','46.jpg','47.jpg','48.jpg','49.jpg','50.jpg','51.jpg','52.jpg','53.jpg','54.jpg',\
		'55.jpg','56.jpg','57.jpg','58.jpg','59.jpg','60.jpg']

#グローバル変数の定期
img=file_names[0]
kaisu=0
kaisu1=0
imagetk_list = list()

# ベースパスを設定
base_path = 'E:/python-kaihatu/nanikana/mask-jp'
base_path1 = 'E:/python-kaihatu/nanikana/mask-r1'

# tkオブジェクトの作成
root = tk.Tk()
root.title("なにかな") #ウィンドウのタイトルを設定
root.geometry("700x570") #ウィンドウのサイズを設定

### キャンバス作成
canvas=tk.Canvas(root,width=550, height=550)
canvas.place(x = 10,y = 10)

#背景画像を読み込み
img1 = cv2.imread('E:/python-kaihatu/nanikana/gazou/buta1.jpg')

def gazou_over():
	global kaisu

	# フルパスを作成
	full_path = os.path.join(base_path, file_names[kaisu])

	# マスクファイルを開く
	mask = cv2.imread(full_path)

	if mask is not None:
		#画像の合成
		result = cv2.bitwise_and(mask,img1)
		#BRG読み込みをRGBに変換
		result = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
		#フォーマットをPILに変換
		result = Image.fromarray(result)
	return result

def kaiten():
	global result1,mask
	# フルパスを作成
	full_path1 = os.path.join(base_path1, file_names1[kaisu1])

	# マスクファイルを開く
	mask = cv2.imread(full_path1)
	
	#画像の合成
	result1 = cv2.bitwise_and(mask,img1)

	#cv2.imshow('test', result)

	#BRG読み込みをRGBに変換
	result1= cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)

	#フォーマットをPILに変換
	result1 = Image.fromarray(result1)
	
	#TkinterのPhotoImageに変換
	result1=ImageTk.PhotoImage(result1)

	canvas.create_image(273,273,image = result1,tag='p1')

def on_button_click():
	global kaisu,imagetk_list
	if  kaisu<65:
		kaisu= kaisu+1

		#旧画像の削除
		canvas.delete('p1')

		result= gazou_over()
		result=ImageTk.PhotoImage(result)
		imagetk_list.append(result)
		canvas.create_image(273,273,image = result,tag='p1')

def on_button1_click():
	global kaisu,imagetk_list
	if  kaisu>0:
		kaisu= kaisu-1

		#旧画像の削除
		canvas.delete('p1')

		result= gazou_over()
		result=ImageTk.PhotoImage(result)
		imagetk_list.append(result)
		canvas.create_image(273,273,image = result,tag='p1')

def on_button2_click():
	global kaisu1,imagetk_list
	if kaisu1<60:
		kaisu1=kaisu1+1
		kaiten()


		#imagetk_list.append(result1)
		#canvas.create_image(273,273,image = result1,tag='p1')

def on_button3_click():
	global kaisu1,imagetk_list
	if kaisu1>0:
		kaisu1=kaisu1-1
		kaiten()

#PILでjpgを使用
img_pil=gazou_over()
img_pil=ImageTk.PhotoImage(img_pil)
#画像ファイルをキャンバスの(0,0)に合わせて表示してみる
canvas.create_image(273,273,image = img_pil,tag='p1')

# ウィジェットの配置や、イベント処理などを記述
button = tk.Button(root, text="開く", command=on_button_click, bg="cyan4", fg="white",width=8, height=1)
button.place(x=595, y=30)
button1 = tk.Button(root, text="閉じる", command=on_button1_click, bg="cyan4", fg="white",width=8, height=1)
button1.place(x=595, y=100)
button2 = tk.Button(root, text="回転", command=on_button2_click, bg="cyan4", fg="white",width=8, height=1)
button2.place(x=595, y=170)
button3 = tk.Button(root, text="逆回転", command=on_button3_click, bg="cyan4", fg="white",width=8, height=1)
button3.place(x=595, y=200)

# メインループの実行
root.mainloop()

python 事始め (6) 画像の回転 第2弾

下準備として,マスク画像の処理が終わりました。

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像読込
img = cv2.imread("E:/python-kaihatu/nanikana/mask-jp/01.jpg")
img1=  cv2.imread("E:/python-kaihatu/nanikana/mask-jp/00.jpg")

# 画像サイズ
height = img.shape[0]  # 高さ
width  = img.shape[1]  # 幅

#ベースパスの設定
base_path = 'E:/python-kaihatu/nanikana/mask-r1'

for i in range(60):
	s = str(i+1)
	s=s+".jpg"
	full_path = os.path.join(base_path, s)

	#画像の回転行列
	rot_matrix = cv2.getRotationMatrix2D((width/2,height/2),  # 回転の中心座標
						i*(-6),                 # 回転する角度
						1,                  # 画像のスケール
					)

	# アフィン変換適用
	afin_img = cv2.warpAffine(img,rot_matrix,(width,height))

	#画像の保存
	img_OR = cv2.bitwise_or(img1, afin_img)
	cv2.imwrite(full_path, img_OR)

cv2.waitKey(0)
cv2.destroyAllWindows()

画像の回転部分は,あるサイトの丸パクリです。回転を理解するには,何と,高校でもならってなかった行列
の式が必要なようでもうお手上げです。行列は,習いませんでしたらから,あれは,数Ⅲの領域なんでしょう
かね。回転には,あまり,立ち入らないことにします。

python 事始め (5) 画像の回転

昔作ったもにはなかった見えるところが回転するような機能を追加します。マスク画像を回転すればいいので
すが,回転すると四隅が黒くなります。

元画像

回転後画像(45度)


これではまずいので,回転後の画像について,下記の画像と OR をとって,四隅を消します。

ORをとる画像

できた画像


ということで,目的の画像ができましたが,これをプログラムでやると,変換に結構時間がかかるようですの
で,必要な画像を一括変化して保存後,その都度呼び出すようにします。
下記が回転に使ったプログラムです。

mport cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像読込
img = cv2.imread("E:/python-kaihatu/nanikana/mask-jp/01.jpg")
img1=  cv2.imread("E:/python-kaihatu/nanikana/mask-jp/00.jpg")
# 画像サイズ
height = img.shape[0]  # 高さ
width  = img.shape[1]  # 幅

#画像の回転行列
rot_matrix = cv2.getRotationMatrix2D((width/2,height/2),  # 回転の中心座標
                                      -45,                 # 回転する角度
                                      1,                  # 画像のスケール
                                    )

# アフィン変換適用
afin_img = cv2.warpAffine(img,               # 入力画像
                          rot_matrix,        # 行列
                          (width,height)     # 解像度
                         )

# 画像表示
img_OR = cv2.bitwise_or(afin_img, img1)
img_OR = cv2.bitwise_or(img1, afin_img)
cv2.imshow('img',img_OR)
cv2.imwrite('E:/python-kaihatu/nanikana/mask-r1/45-m.jpg', img_OR)
cv2.waitKey(0)
cv2.destroyAllWindows()