Open Mi-cchy opened 2 years ago
if self.stuckTime > 0:
の場合はトルネードdef stuck_detection(self):
print("acceralation:",self.bno055.ax**2+self.bno055.ay**2+self.bno055.az**2," const:",ct.const.STUCK_ACC_THRE**2*1000)
if self.stuckTime > 0:
print("Stuck!!")
if time.time() - self.stuckTime > ct.const.STUCK_MOTOR_TIME_THRE:#閾値以上の時間モータを回転させたら
self.rightMotor.stop()
self.leftMotor.stop()
self.stuckTime = 0
self.countstuckLoop = 0
else:
#トルネード実施
self.rightMotor.go(ct.const.STUCK_MOTOR_VREF)
self.leftMotor.back(ct.const.STUCK_MOTOR_VREF)
elif (self.bno055.ax**2+self.bno055.ay**2+self.bno055.az**2) >= ct.const.STUCK_ACC_THRE**2*1000:
print("stuck count +1")
print("acceralation:",self.bno055.ax**2+self.bno055.ay**2+self.bno055.az**2)
self.countstuckLoop+= 1
if self.countstuckLoop > ct.const.STUCK_COUNT_THRE: #加速度が閾値以下になるケースがある程度続いたらスタックと判定
print("stuck")
self.stuckTime = time.time()#スタック検知最初の時間計測
self.rightMotor.stop()
self.leftMotor.stop()
else:
self.rightMotor.go(70)
self.leftMotor.go(70)
else:
print("not stuck")
self.rightMotor.go(70)
self.leftMotor.go(70)
塀など地面以外が写ったwin1の再構成
![]()
何もない地面(グラウンド)が写ったwin5の再構成
![]()
エッジ画像を用いた再構成について
再構成誤差が現れることが見込まれる理由
- 地面(グラウンド)の場合には砂利などがエッジ検出されることによりエッジ部分が広範にわたる
- 地面以外の砂利ではない部分(本番では轍?)が含まれる場合、エッジ部分が少ない
上記2点により、砂利で学習された固有ベクトルを用いた再構成をした場合にはエッジが多いほうが再構成誤差が少ないはず
現在差が出ていない理由として、再構成画像が全体的に薄く(白っぽく)ぼやけてしまっていることが挙げられる
解決策として下限値の補正などを行う…?
今後試験する際にエッジの強度を変えたい場合の簡便な説明
フォルダ
wolvez2022/Testcode/EtoE/baaa_feature.py
変更箇所
Feature_img()
クラスedge()
メソッド該当コード
def edge(self): #self.output_img_list = [] self.org_img = cv2.imread(self.imp_p, 1) self.img_gray = cv2.cvtColor(self.org_img, cv2.COLOR_BGR2GRAY) self.gray=cv2.Canny(self.img_gray,100,200) # self.gray=cv2.Canny(self.img_gray,200,550) # アーリスではこちらの値を用いた方が適切かも(エッジ検出感度) self.save_name = self.sav_d + f"/edge_{self.frame_num}.jpg" cv2.imwrite(self.save_name,self.gray) self.output_img_list.append(self.save_name)
上記における
self.gray=cv2.Canny(self.img_gray,100,200)
の2,3番目の引数の値を変更する
- 2番目の引数がエッジのつながりやすさ(小さいほどエッジ線がつながりやすい)
- 3番目の引数がエッジ検出の感度(小さいほどエッジ検出感度が高い)
元画像
エッジ画像
@Masato104 Cannyの0 or 255じゃなくて微分画像の方が画像再構成に適してる説はない? http://opencv.jp/sample/gradient_edge_corner.html
@Masato104
Cannyの0 or 255じゃなくて微分画像の方が画像再構成に適してる説はない?
@Mi-cchy @ 確かにその方が濃淡も含めて再現できていいかもですね、、 明日試してみます!
cv2.Canny
, cv2.Laplacian
と、edge()
, enphasis()
メソッド=== 結論からいうと勾配によるエッジ検出は既に特徴画像の一つとして存在していた ===
大きく分けて二種類
- 原理としては、隣接ピクセルとの差(勾配)を強調することによってエッジを検出する
- 以下のようなカーネル(3×3行列)をループで回してかけることにより算出する
$$ {kernel =} \begin{bmatrix} 0 & 1 & 0 \ 1 & -4 & 1 \ 0 & 1 & 0 \end{bmatrix} $$
実装済みの
enphasis()
メソッドについて
def enphasis(self): #self.output_img_list = [] self.org_img = cv2.imread(self.imp_p, 1) self.org_img = cv2.cvtColor(self.org_img, cv2.COLOR_BGR2RGB) kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]], np.float32) self.output_img = cv2.filter2D(self.org_img, -1, kernel) self.save_name = self.sav_d + f"/enphasis_{self.frame_num}.jpg" cv2.imwrite(self.save_name, self.output_img) self.output_img_list.append(self.save_name)
enphasis()
に挿入していたため、エッジ部分がやや強調される画像となるために「エッジ強調」としてenphasis()
としていた enphasis()
の処理はcv2.Laplacian()
とまったくもって同義である
cv2.Laplacian()
と現行のenphasis()
の出力比較cv2.Laplacian()
enphasis()
スタック検知のもろもろを書き示したい所存