none
座標を求めたい RRS feed

回答

  • なぜ、今の段階で別の方法論をお求めなのでしょうか?

    (0, 0) 原点から同一距離の点群について、あなたがほしいとされている点を定義することはあなた自身でなすべきことです。
    この定義自体は、ラベリングだろうと他の方法だろうと関係なく、あなた自身が定義する必要のあることです。
    (例:輪郭に属する点群すべての中から原点との距離を求め、最小のものを採用する。ただし、最小のものが複数検出された場合はなったなり(最初に出現するもの)と割り切る。あるいは、同一距離なら Y 座標が最小のものを選ぶといった2つ目のルールを設ける)

    さて、今回の掲載画像で一意に定まらないかどうかは、正直わかりません。
    あなたが利用されているライブラリやパラメーター、そして検出された輪郭の性質によります。
    そして、今掲載されている画像で問題ないとしても、あなたが他の画像に対して試す可能性を否定していない以上、今回の画像に断定した回答は危険と考えるわけです。

    もう一つ書くならば、あなたがどこまでできているのかわかりません。
    それぞれの輪郭に属する、X, Y の点群(座標の集合)は得られているのですか?
    それが得られていることを前提に議論されているので、前提が満たされていないなら話がかみ合うことがありません。

    2014年12月7日 3:49
    モデレータ

すべての返信

  • 左上とは何を以て定義できるのでしょうか?
    何らかの前提、制約条件がある状況に限った話なのでしょうか?

    ラベリング領域は矩形と限りません。
    また、今回のように左上と言えるものが一点しかないならともかく、(50, 100) と (100, 50) といった 2 つの点が候補になったとき、どちらが左上なのでしょうか。

    2014年12月1日 22:36
    モデレータ
  • すみません。要点を得ておらず

    ラベリングするものを四角形と限定していた場合の話ならというのが上記の質問で

    仮に5角形、6角形の多角形にになった場合も左上からラベリングした場合、一番最初にラベリングされる黄色の部分の座標を求めるにはどうすれば宜しいでしょうか?

    つまり山みたいな図形があった場合山の頂上の座標を求めるにはどのようにすれば宜しいでしょうか?

    2014年12月1日 23:17
  •  なんだか、たくさん、端折ってあるように思います。
     問題は、「期待する状態」と「実行結果」が異なっているから発生します。「期待する結果」と、「何を実行したのか」、「どのような結果が得られたのか」を、きちんと説明してください。ここで回答する人たちは、あなたよりたくさんのことを知っていたり、思いついたりするでしょう。それらの答えを引き出すためには、「ここに書いてあることしかわからない」人たちに、あなたが遭遇している問題が、どれくらい正確に伝わるかに依存します。

     Azuleanさんの返答を、もう一度よく読んでください。この部分です。

    、(50, 100) と (100, 50) といった 2 つの点が候補になったとき、どちらが左上なのでしょうか。

     これと類似して、「座標が、たとえば(0, 50), (50, 0), (100, 50), (50, 100)、つまり◆の様な配置になったら、どれが左上なのでしょうか。」という質問もあり得ます。よって、まず、「左上とは何を以て定義できるのでしょうか?」ということを明らかにしてください。「左上とは、どのような点か」が定まれば、「黄色ブロックにおけるXの最小値とYの最小値ではありません」ということもなくなるはずです。つまり、あなたが「左上とは、このような点」ということがわかっていないから、それをコード化できないのではないですか?

    「下記コードにおいて、」・・・書かれているコードは、中括弧の開閉が合っていません。中途半端なコードなので、何をしているのか確証が持てません。
    「下記写真の黄色の部分をラベリングして、」・・・写真には黄色い部分は1つしかありません。「写真に黄色い部分は1つ」と理解します。
    「黄色の四角のblob3のX座標とY座標を求めている」・・・「黄色の四角」と「blob3」の関係がわかりません。
    「私が知りたいのは、四角の左上角の座標であって黄色ブロックにおけるXの最小値とYの最小値ではありません。」・・・コードが中途半端なので、この判断が正しいのかどうかわかりません。コードの理解できる範囲では、「int と CvBlob 型のペアを納める blobs がある。この時、int は CvBlob 内のアイテム数である。」「blobs 内のすべてを検査する。」「CvBlob 内のすべてを検査する(つもりで、大元の blobs からアイテムを取り出している)。」「blob3.Rect.X が、0以上、かつ900未満、かつ blob3.Rect.Y が500未満のとき、textBox8 に X、textBox9 に Y を表示する。」ということなので、四角形の左上の座標も、X の最小値も、Y の最小値も取り出せていません。


    仮に5角形、6角形の多角形にになった場合も左上からラベリングした場合、一番最初にラベリングされる黄色の部分の座標を求めるにはどうすれば宜しいでしょうか?

     意味がわかりません。「左上からラベリングする」のであれば、1番目の要素(インデックスが0の要素)が左上ではないですか?
     また、「ラベリングする」とは、どのようなことでしょうか。
     「5角形、6角形の多角形に」なるのは、黄色いマークでしょうか。それとも、複数の黄色いマークが置かれた場所でしょうか。


     ある製品の写真を撮影する。その製品には、検査しなければならない箇所がある。検査しなければならない範囲を特定するために、複数(3箇所以上)の黄色いマークが付いている。その黄色いマークの位置を写真から抽出し(これが「ラベリングする」?)、何らかの順番に並べ(るために「左上」が必要?)、その範囲を画像処理して検査する・・・というようなことでしょうか。←ということが、第三者に想像されて良いのですか?つまり、こういう場で聞いていいのですか?今出ている情報を「出して良い」と、上長の許可を受けています?


    Jitta@わんくま同盟

    2014年12月2日 13:41
  • 何となく似たような話をした覚えがあるなと思って kirua777 さんのスレッド一覧を見ると、過去に以下のようなスレッドで話を交わしています。

    opencvsharpeにおいてラベリングした四隅を知りたい
    https://social.msdn.microsoft.com/Forums/ja-JP/7129e62a-29d0-4adb-92a2-b1a8f40ae810/opencvsharpe?forum=csharpexpressja

    結局、上記のスレッドでは何か得られたのでしょうか。
    今回の場合、抽出された領域の輪郭から点群を抽出し、条件を満たす最良の点を導けば済むと考えられたためです。

    2014年12月2日 13:50
    モデレータ
  • 今回の場合、抽出された領域の輪郭から点群を抽出し、条件を満たす最良の点を導けば済むと考えられたためです。

    その「条件」を、本人が理解できていないような?最初の文章からは、コードに書いたつもりらしいけど、どれが相当するのか分からない。

    # 「ラベリング」は、http://opencv.jp/sample/others.html こういうことですね。


    Jitta@わんくま同盟

    2014年12月2日 14:16
  • すみません。何度も同じ質問をしてしまい。Azuleanさんのおっしゃる通り点群blob3の中から最良の点を導きだせばいいのだと思いますが、そのロジックが解っていません。上記で左上からラベリングというのは(0,0)(1,0),(2,0)...(0,1)(1,1),(2,1)と黄色い部分を探していって、最初の黄色部分の座標を求めたいのですが、点群blob3から導きだすロジックが解っていません。

    何卒、宜しくお願い致します。

    2014年12月6日 23:35
  • すみません。何度も同じ質問をしてしまい。Azuleanさんのおっしゃる通り点群blob3の中から最良の点を導きだせばいいのだと思いますが、そのロジックが解っていません。上記で左上からラベリングというのは(0,0)(1,0),(2,0)...(0,1)(1,1),(2,1)と黄色い部分を探していって、最初の黄色部分の座標を求めたいのですが、点群blob3から導きだすロジックが解っていません。

    分かっていないのはロジックでは無く条件ではないでしょうか……。

    この探索方法だと、Y座標が最も小さい点が「左上」ということになります。では、(10,10),(20,9),(20,20),(10,20)という頂点を持った四角形、つまりほぼ正方形だが「右上」の点だけ1ピクセル上にあるという図形でも、この「右上」の点が「左上」ということになりますが…?

    本当にこれで良いのなら、輪郭座標のコレクションを順次検索して、Y座標が最も小さい点を探すだけですけれども。

    2014年12月7日 0:14
  •  「プログラミング」というもの、そのものが分かっていないようです。

     プログラミングとは、コンピュータにさせたいことを、コンピュータに分かる言語で、その言語に定まった方法で命令することです。そのためには、「コンピュータにさせたいこと」、「させたいことが実現する条件」、および、「その条件を満たしていく方法と順序」が分かっていなければなりません。「条件を満たしていく方法と順序」がロジックです。では、「させたいことが実現する条件」は、なんでしょうか。

     最終的に、「左上の点」を求めたい、ということは分かりました。

     では、その「点」というのは、「黄色いエリアの頂点の一つ」なのでしょうか、それとも「複数ある黄色いエリアの一つ」なのでしょうか。あなたの投稿や、最初の投稿のコードからは、その辺が曖昧です。

     次に、「左上の点」というのは、どのようにして分かるのでしょうか。もちろん、あなたは、それを見て分かるでしょう。では、あなたは、なぜその点を「左上」と認識できるのですか?コンピュータにとって、左上なんてありません。人間が便宜的に二次元として扱っているのであって、コンピュータの中ではメモリという(これも便宜的な表現ですが)直線の上にあります。その中から、どうやって「左上」と判別するのでしょうか。

     コンピュータの中では、左上が原点で、右へ行くほど x が増え、下へ行くほど y が増えるのが一般的です。そのような座標系において、点の集合の中心から、真上を0度として左へ45度回転した線に一番近いもの、というのは一つの条件です。しかし、同距離に点が二つ有る場合は、どちらを「左上」にするのでしょうか。


    Jitta@わんくま同盟

    2014年12月7日 2:15
  • 同距離に点が二つ有る場合は、どちらを「左上」にするのでしょうか。>上記画像でもそのようなシュチレーションになるのでしょうか?対角線の距離が一番遠いという条件を付けくわえてもでてくるのでしょうか?

    すみません質問しておきながら

    ラベリング以外でこの頂点の座標を特定できる他の方法論があれば是非、教えて頂きたいです。

    2014年12月7日 2:50
  • なぜ、今の段階で別の方法論をお求めなのでしょうか?

    (0, 0) 原点から同一距離の点群について、あなたがほしいとされている点を定義することはあなた自身でなすべきことです。
    この定義自体は、ラベリングだろうと他の方法だろうと関係なく、あなた自身が定義する必要のあることです。
    (例:輪郭に属する点群すべての中から原点との距離を求め、最小のものを採用する。ただし、最小のものが複数検出された場合はなったなり(最初に出現するもの)と割り切る。あるいは、同一距離なら Y 座標が最小のものを選ぶといった2つ目のルールを設ける)

    さて、今回の掲載画像で一意に定まらないかどうかは、正直わかりません。
    あなたが利用されているライブラリやパラメーター、そして検出された輪郭の性質によります。
    そして、今掲載されている画像で問題ないとしても、あなたが他の画像に対して試す可能性を否定していない以上、今回の画像に断定した回答は危険と考えるわけです。

    もう一つ書くならば、あなたがどこまでできているのかわかりません。
    それぞれの輪郭に属する、X, Y の点群(座標の集合)は得られているのですか?
    それが得られていることを前提に議論されているので、前提が満たされていないなら話がかみ合うことがありません。

    2014年12月7日 3:49
    モデレータ
  • すみません 

    座標集合求めれていません

    多分、下記のコードの候補から得られると思うのですが、opencvについてはサイトは色々あるのですが、opencvsharpeについてのサイトが少なく情報不足です。

    2014年12月7日 23:52
  • すみませんありました。

    ConvertToPolygon()ですね。

    後は条件式を構築すればいいのですね。

    2014年12月7日 23:57