OpenCVのカメラからキーボードのPをクリックしてキャプチャーする際に,640×480 (4:3)から横幅を切って150×150(1:1)のサイズにすることはできますか?
#試した方法
今のプログラムの書き方だと、640×480から150×150のサイズに変更されるようにはなっていますが、映っているもの全てが細長くなってしまいます。
これを改善するために、https://qiita.com/fanfanta/items/8dfd598c7d22b07847b5このようなサイトの様に左右を切り取るようにしたいのですがプログラムをどう書き直せばよいのでしょうか。
Python
1import nnabla as nn 2import nnabla.functions as F 3import nnabla.parametric_functions as PF 4from nnabla.utils.data_iterator import data_iterator_csv_dataset 5import os 6import cv2 7from datetime import datetime 8import pandas as pd 9import matplotlib.pyplot as plt 10import numpy as np 11from PIL import Image 12 13 14 15def network(x, test=False): 16 17 # Input:x -> 3,150,150 18 # ImageAugmentation 19 if not test: 20 h = F.image_augmentation(x, (3,150,150), (0,0), 1.0, 1.0, 0.0, 0.7, 0.0, False, False, 1.2, False, 1.2, 0, False, 0.0) 21 else: 22 h = x 23 24 # Convolution -> 8,150,150 25 h = PF.convolution(h, 8, (3,3), (1,1), name='Convolution') 26 # ReLU 27 h = F.relu(h, True) 28 # Convolution_2 29 h = PF.convolution(h, 8, (3,3), (1,1), name='Convolution_2') 30 # ReLU_2 31 h = F.relu(h, True) 32 # MaxPooling -> 8,75,75 33 h = F.max_pooling(h, (2,2), (2,2)) 34 # Convolution_3 -> 16,75,75 35 h = PF.convolution(h, 16, (3,3), (1,1), name='Convolution_3') 36 # ReLU_3 37 h = F.relu(h, True) 38 # Convolution_4 39 h = PF.convolution(h, 16, (3,3), (1,1), name='Convolution_4') 40 # ReLU_4 41 h = F.relu(h, True) 42 # MaxPooling_2 -> 16,37,37 43 h = F.max_pooling(h, (2,2), (2,2)) 44 # Convolution_5 -> 32,37,37 45 h = PF.convolution(h, 32, (3,3), (1,1), name='Convolution_5') 46 # ReLU_5 47 h = F.relu(h, True) 48 # Convolution_6 49 h = PF.convolution(h, 32, (3,3), (1,1), name='Convolution_6') 50 # ReLU_6 51 h = F.relu(h, True) 52 53 # MaxPooling_3 -> 32,18,18 54 h = F.max_pooling(h, (2,2), (2,2)) 55 # Convolution_8 -> 64,18,18 56 h = PF.convolution(h, 64, (3,3), (1,1), name='Convolution_8') 57 # ReLU_8 58 h = F.relu(h, True) 59 # Convolution_9 60 h = PF.convolution(h, 64, (3,3), (1,1), name='Convolution_9') 61 # ReLU_9 62 h = F.relu(h, True) 63 64 # MaxPooling_4 -> 64,9,9 65 h = F.max_pooling(h, (2,2), (2,2)) 66 # Convolution_11 -> 128,9,9 67 h = PF.convolution(h, 128, (3,3), (1,1), name='Convolution_11') 68 # ReLU_11 69 h = F.relu(h, True) 70 # Convolution_12 71 h = PF.convolution(h, 128, (3,3), (1,1), name='Convolution_12') 72 # ReLU_12 73 h = F.relu(h, True) 74 75 # MaxPooling_5 -> 128,4,4 76 h = F.max_pooling(h, (2,2), (2,2)) 77 # Affine -> 100 78 h = PF.affine(h, (100,), name='Affine') 79 # ReLU_14 80 h = F.relu(h, True) 81 # Dropout 82 if not test: 83 h = F.dropout(h, 0.5, 0) 84 # Affine_2 85 h = PF.affine(h, (100,), name='Affine_2') 86 # ReLU_15 87 h = F.relu(h, True) 88 # Dropout_2 89 if not test: 90 h = F.dropout(h, 0.5, 0) 91 # Affine_3 -> 26 92 h = PF.affine(h, (26,), name='Affine_3') 93 # Softmax 94 h = F.softmax(h) 95 # CategoricalCrossEntropy -> 1 96 #h = F.categorical_cross_entropy(h, y) 97 return h 98class_names = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] 99cap = cv2.VideoCapture(0) # 任意のカメラ番号に変更する 100 101 102new_dir_path = "./realtime/" 103os.makedirs(new_dir_path, exist_ok=True) 104 105 #カメラスタート 106while True: 107 108 ret, frame = cap.read() 109 # フレームが取得できない場合はループを抜ける 110 111 112 cv2.imshow("camera", frame) 113 114 k = cv2.waitKey(1)&0xff # キー入力を待つ 115 if k == ord('p'): 116 117 # 「p」キーで画像を保存 118 119 date = datetime.now().strftime("%Y%m%d_%H%M%S") 120 path = new_dir_path + date +".png" 121 cv2.imwrite(path, frame) 122 image_gs = cv2.imread(path) 123 124 path = new_dir_path + date +".png" 125 dst = cv2.resize(image_gs,(150,150)) 126 cv2.imwrite(path, dst) 127 128 f = pd.DataFrame(columns=["x:data","y:data"]) 129 xdata = path 130 ydata = 0 131 new_name = pd.Series([xdata,ydata],index=f.columns) 132 f = f.append(new_name, ignore_index=True) 133 f.to_csv('valu.csv',index=False,header = True ) 134 135 test_data = data_iterator_csv_dataset("C:\Users\username\Desktop\outdata\valu.csv",1,shuffle=False,normalize=True) 136 137 138 path = new_dir_path + "test" +".png" 139 cv2.imwrite(path, frame) 140 image_gs = cv2.imread(path) 141 142 path = new_dir_path + date +".png" 143 dst = cv2.resize(image_gs,(150,150)) 144 cv2.imwrite(path, dst) 145 146 147 148 np.set_printoptions(suppress=True) 149 #ネットワークの構築 150 151 nn.clear_parameters() 152 153 154 nn.load_parameters('C:\Users\username\Desktop\outdata\smallyubimoji.files\20210126_195301\results.nnp') 155 print("load model") 156 157 x = nn.Variable((1,3,150,150)) 158 x.d = cv2.resize(frame, (150,150)).transpose(2,0,1).reshape(x.shape) 159 y = network(x, test=True) 160 y.forward() 161 162 print(y.d[0]) 163 print(np.argmax(y.d[0])) 164 print(class_names[np.argmax(y.d[0])]) 165 166 elif k == ord('q'): 167 # 「q」キーが押されたら終了する 168 169 break 170 171 # キャプチャをリリースして、ウィンドウをすべて閉じる 172cap.release() 173cv2.destroyAllWindows()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/01 12:08
2021/02/03 08:36