質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

370閲覧

エッジ検出による三角構図の検出をしようと考えていますがうまくいきません

koshian0129

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/09 14:59

編集2023/01/10 04:18

イメージ説明### 前提

Pythonで山岳風景動画から(1フレームではなく)1秒ごとに切り取った各画像を用意したのち、各画像にエッジ検出をかけてその中から各画像ごとに三角構図を作り出すプログラムを書きたいです。
具体的な質問をする前にイメージを持ってもらいたいので検出方法を説明させてください。私の想定では検出する三角形の一番上の頂点は検出した画像内のエッジの中で一番上(画像内では山頂にあたる)にくるエッジのy座標を一点とります。また左右の三角形の頂点(画像内ではふもとに当たる)はその画像のx座標が一番左と右にくるエッジのy座標を取ります。
この三点を結んで三角形を描画し、三角構図を検出するプログラムを書きたいのですがうまくいきません。

下のコードで実行すると出力に大幅に時間がかかるほか、出力された結果も各y座標がすべて同じような高さになってしまいます。

実現したいこと

出力にかける時間を減らすのと、きちんとしたy座標が描画されるようにするにはどこにどう修正を加えれば良いでしょうか?

発生している問題・エラーメッセージ

エラーはありませんが、実行結果がおかしいです。三角形を作るはずが一直線になってしまいました。エッジ検出はうまく作動していると思います。

該当のソースコード

Python

1from numpy.ma.core import sqrt 2import cv2 3import sys 4import numpy as np 5import matplotlib.pyplot as plt 6from PIL import Image 7 8class Vector2: 9 x = 0 10 y = 0 11 12class Triangle: 13 ver = Vector2() 14 r = Vector2() 15 l = Vector2() 16 17def dacor(yRec, x): 18 if abs(yRec[x] - yRec[x - 1]) > 200: 19 return True; 20 else: 21 return False; 22 23def area(ver, lMax, rMax): 24 dl = sqrt(pow(ver.x - lMax.x , 2) + pow(ver.y - lMax.y , 2)) 25 dr = sqrt(pow(ver.x - rMax.x , 2) + pow(ver.y - rMax.y , 2)) 26 db = sqrt(pow(rMax.x - lMax.x , 2) + pow(rMax.y - lMax.y , 2)) 27 s = 1 / 2 * (dl + db + dr) 28 st = sqrt(s * (s - dl) * (s - db) * (s - dr)) 29 return st; 30 31def saturation(pixel): 32 return (pixel.max() - pixel.min()) / pixel.max(); 33 34def middle(yRec): 35 for item in yRec: 36 if item > min(yRec) and item < max(yRec): 37 return item; 38 return 0; 39 40def functionKOZUESC(frame, width, height, nowframe): 41 42 plt.imshow() 43 plt.show() 44 45 return 0; 46 47 48 49def functionKOZU(frame, width, height, nowframe): 50 x = 0 51 y = 0 52 sum = 0 53 average = 0 54 flag = False 55 edgeFlag = False 56 yRec = [height] * int(width) 57 brack = 255 58 tri = Triangle() 59 60 while y < height: 61 while x < width : 62 sum += saturation(frame[y][x]) 63 x += 1 64 y += 1 65 66 average = sum / (width * height) 67 68 if average < 30: 69 highTh = 400 70 lowTh = 50 71 else: 72 highTh = 530 73 lowTh = 200 74 75 img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 76 edge_img = cv2.Canny(img_gray, highTh, lowTh) 77 78 flag = False 79 x = 0 80 y = 0 81 82 #while x < width: 83 #while y < height: 84 #if not flag: 85 #if edge_img[y][x] == brack: 86 #yRec[x] = y 87 #flag = True 88 # y += 1 89 #if x -1 >= 0: 90 #if not flag: 91 #yRec[x] = yRec[x - 1] 92 #if dacor(yRec, x): 93 #yRec[x] = yRec[x - 1] 94 #else: 95 #if not flag: 96 #yRec[x] = middle(yRec) 97 #x += 1 98 #flag = False 99 100 for x,i in enumerate(edge_img): 101 for y, j in enumerate(i): 102 if j == brack: 103 yRec[x] = y 104 flag = True 105 if x -1 >= 0: 106 if not flag: 107 yRec[x] = yRec[x - 1] 108 if dacor(yRec, x): 109 yRec[x] = yRec[x - 1] 110 else: 111 if not flag: 112 yRec[x] = middle(yRec) 113 flag = False 114 115 print(yRec) 116 117 x = 0 118 edgeFlag = False 119 rMax = Vector2() 120 lMax = Vector2() 121 ver = Vector2() 122 123 while x < width: 124 if yRec[x] == min(yRec): 125 ver.y = yRec[x] 126 ver.x = x 127 edgeFlag = True 128 if not edgeFlag: 129 if yRec[x] > rMax.y: 130 lMax.y = yRec[x] 131 lMax.x = x 132 else: 133 if yRec[x] > lMax.y: 134 rMax.y = yRec[x] 135 rMax.x = x 136 x += 1 137 138 plt.imshow(edge_img) 139 plt.show() 140 s = area(ver, lMax, rMax) 141 142 if s > 0: 143 tri.ver = ver 144 tri.r = rMax 145 tri.l = lMax 146 147 148 return tri 149 150cap = cv2.VideoCapture('drive/MyDrive/サンプル動画/sample_video2.mp4') 151 152if not (cap.isOpened()): 153 sys.exit('Can not Open VideoFile. Pleas Chack flie path.') 154 155width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) 156height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) 157fps = cap.get(cv2.CAP_PROP_FPS) 158fcount = cap.get(cv2.CAP_PROP_FRAME_COUNT) 159nowframe = 0 160kozu = np.array([Triangle()]) 161 162 163while cap.get(cv2.CAP_PROP_POS_FRAMES) < fcount: 164 ret, frame = cap.read() 165 if not ret and cap.get(cv2.CAP_PROP_POS_FRAMES) <= fcount: 166 sys.exit('Error, Can Not Read Frame' + str(nowframe)) 167 kozu = np.append(kozu ,functionKOZU(frame, width, height, nowframe)) 168 nowframe += fps 169 cap.set(cv2.CAP_PROP_POS_FRAMES, nowframe) 170 171#for item in kozu: 172# print(item.ver.y) 173# print(item.l.y) 174# print(item.r.y)

試したこと

出力結果は添付画像とセットでこちらになります(処理が遅く、一枚目の結果のみになります)
[0, 0, 0, ... , 0, 0, 0, 1080.0, 1080.0, 1080.0, ... , 1080.0, 1080.0, 1080.0]

補足情報(FW/ツールのバージョンなど)

開発環境はgoogle claboratryになります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2023/01/10 02:02

> 出力結果は添付画像とセット 「添付画像」が質問中に見えません
koshian0129

2023/01/10 03:57

すみません、今先ほど載せ直しました
jbpb0

2023/01/10 03:59

まだ質問中に画像は見えません 質問者さんがこの質問を見たら、画像が見えるのでしょうか?
koshian0129

2023/01/10 04:02

おそらく画像がそのまま添付されているのではなく、お手数おかけしますがURL部分をコピペして検索していただければ画像が出てくるかと思います。 自分も初めて利用したのでわからない部分もあるのですが先ほどコピペして調べたら出てきました。
jbpb0

2023/01/10 04:11

https://teratail.com/questions/jizxenoh41aosc を見てください 質問を正しく編集したら、上記質問のように、質問中に画像が見えるようになるはずです > URL部分をコピペして検索 のように、他人に余計な作業を強いたら、回答がされにくくなると思いますよ
koshian0129

2023/01/10 04:16

もう一度試したところうまく載せることができました!
jbpb0

2023/01/10 04:17 編集

もしかして、現状の質問で「発生している問題・エラーメッセージ」の下は、 ``` エラーはありませんが...(略) ``` のようになってませんでしょうか? もしそうなってるなら、二つの「```」を削除してみてください 【追記】 画像が見えました
jbpb0

2023/01/10 11:47

> エッジ検出はうまく作動していると思います。 本当にうまく、狙ってる > 検出する三角形の一番上の頂点は検出した画像内のエッジの中で一番上(画像内では山頂にあたる)にくるエッジのy座標を一点とります。また左右の三角形の頂点(画像内ではふもとに当たる)はその画像のx座標が一番左と右にくるエッジのy座標を取ります。 のように検出できてるか、検出した座標を元画像に重ね書きして、確認してみたらいかがでしょうか?
koshian0129

2023/01/10 12:01

回答ありがとうございます 一つ確認させていただきたいのですが、このプログラムで出力されている数値は検出されたエッジの座標なのでしょうか? 知り合いに手伝ってもらって作ったプログラムなので判断が難しくて...
jbpb0

2023/01/10 12:19

まずは、自分でコードを読んで、理解するように努力してください 分からないところは調べるとか、知り合いに聞くとかして、自分なりにできるだけ努力して、それでも分からないところを聞いてください https://teratail.com/help/question-tips の「1. 質問をする前に心がけてほしいこと」も見てください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問