重心を求めるにはどうしたらよいですか?


大学生  2005-09-28 15:29:48  No: 59138  IP: 192.*.*.*

最近OpenCVの勉強を始めました。
読み込んだ画像を2値化し、その画像内の点の重心を求めたいのですが、座標設定からうまくいきません。
お手数ですが教えてください。

編集 削除
επιστημη  2005-09-28 15:39:35  No: 59139  IP: 192.*.*.*

'うまくいかない'を説明してください。
# そもそもそれはプログラム上の問題ですか?

編集 削除
大学生  2005-09-28 15:42:58  No: 59140  IP: 192.*.*.*

すいません。詳しく言うと
うまくいきません→やりかたがわかりません。です。
重心を求めるプログラムがわからないのです。
読み込んだ画像は小さな点があるだけです。

編集 削除
επιστημη  2005-09-28 15:43:16  No: 59141  IP: 192.*.*.*

> 画像内の点の重心を求めたいのですが

…わかんない。
点に重さなんかあるの? 点の重心ってナニ? 重心はその点そのものじゃなくて?

編集 削除
大学生  2005-09-28 15:54:21  No: 59142  IP: 192.*.*.*

点には多少の大きさと歪みがありまして、研究室の教授が言う曰く
「点のX座標の平均と、Y座標の平均を出すことで重心の座標が求められる。」と・・・
ここで言う重心とは剛体ではなく、質点の重心です。
わかりにくい質問で申し訳ございません。

編集 削除
επιστημη  2005-09-28 16:01:06  No: 59143  IP: 192.*.*.*

え? じゃ答出てんじゃん。
「点のX座標の平均と、Y座標の平均を出すことで重心の座標が求められる。」
N個の点の集合 point[N] があるんなら、
Σpoint[i](i=0..N-1) を N で割ればいい。

編集 削除
επιστημη  2005-09-28 16:06:50  No: 59144  IP: 192.*.*.*

OkWebにも同様の質問「オブジェクトの重心について」がありました。
http://okweb.jp/kotaeru.php3?q=1678415

マルチポスト? 偶然? 同じ課題を与えられた別人?
# マルチポストなら嫌われます。ご注意を。

編集 削除
大学生  2005-09-28 16:13:27  No: 59145  IP: 192.*.*.*

ありがとうございます。初心者ですみません。

その点の集合をx座標、Y座標で抽出するにはどうしたらいいでしょうか?
また画像の左上を原点にしたいのですが、それは設定する必要はあるのでしょうか?

参考書もなく独学でやっているので、わかりにくくてごめんなさい。

編集 削除
大学生  2005-09-28 16:16:49  No: 59146  IP: 192.*.*.*

上のサイト見ました。
偶然です。しかも同じ日にというところに驚きです。

編集 削除
επιστημη  2005-09-28 16:18:25  No: 59147  IP: 192.*.*.*

> その点の集合をx座標、Y座標で抽出するにはどうしたらいいでしょうか?

2値化された「処理の入力となるデータ」がどんな形で
与えられているのか分からぬ限り答えようがありません。

> また画像の左上を原点にしたいのですが、それは設定する必要はあるのでしょうか?

質問の意味が理解できません。
「画像の左上を原点にしたい」ならすればいい。
左上が(0,0)となるように平行移動するだけ。

編集 削除
大学生  2005-09-28 16:24:46  No: 59148  IP: 192.*.*.*

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(int argc,char *argv[])
{
  IplImage *src;
  IplImage *gry;
  IplImage *bin;

  src=cvLoadImage("ほにゃらら");

  CvSize size;
  size.width = src->width;
  size.height = src->height;

  
  gry=cvCreateImage(size,IPL_DEPTH_8U,1);
  bin=cvCreateImage(size,IPL_DEPTH_8U,1);

  cvCvtColor(src,gry,CV_BGR2GRAY);
  cvThreshold(gry,bin,70,255,CV_THRESH_BINARY);

  cvvInitSystem(argc, argv);
  cvNamedWindow("BIN",CV_WINDOW_AUTOSIZE);
  cvShowImage("BIN",bin);
  cvvWaitKey("BIN");

  return 1;
}


こんな感じで2値化しています。こっからX・Yに分けて座標をもとめたいのですが・・・

編集 削除
επιστημη  2005-09-28 16:31:41  No: 59149  IP: 192.*.*.*

sumX = 0;
sumY = 0;
points = 0;
for ( x = 0; x < 幅; ++x ) {
  for ( y = 0; y < 高; ++y ) {
    if ( 座標(x,y)に点がある ) {
      ++points;
      sumX += x;
      sumY += y;
    }
  }
}

これでX,Y各座標の総和がsumX,sumYに求まっています。
点の総数がpointsなので、sumX,sumYそれぞれをpointsで割れば平均。

編集 削除
大学生  2005-09-28 16:36:43  No: 59150  IP: 192.*.*.*

あっざーーーーーーーす!!
本当に感謝します。

またなんかあったら書き込みますので面倒とは思いますがよろしくお願いします。

編集 削除
επιστημη  2005-09-28 16:40:05  No: 59151  IP: 192.*.*.*

いたたたた…もしかして教えすぎた?
# てゆっか、わからんかった?

鵜呑みにせんと、良く噛んでお召し上がりください。

編集 削除
大学生  2005-09-28 16:43:26  No: 59152  IP: 192.*.*.*

ちょうど良い噛み具合です。
本当は教えすぎてもらいたかったのですが・・・
できたらお願いします。

編集 削除
επιστημη  2005-09-28 16:46:43  No: 59153  IP: 192.*.*.*

> できたらお願いします。

なにを? 
重心を求めるネタはこれで全部だろうから「教えすぎ?」と感じました。
# 次回は注意しよう。あなたのためにならない。

編集 削除
大学生  2005-09-28 16:48:24  No: 59154  IP: 192.*.*.*

そうですね。ほんとうにありがとうございました。
本当に感謝しています。

編集 削除