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


大学生  2005-09-29 00:29:48  No: 59138

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


επιστημη  2005-09-29 00:39:35  No: 59139

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


大学生  2005-09-29 00:42:58  No: 59140

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


επιστημη  2005-09-29 00:43:16  No: 59141

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

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


大学生  2005-09-29 00:54:21  No: 59142

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


επιστημη  2005-09-29 01:01:06  No: 59143

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


επιστημη  2005-09-29 01:06:50  No: 59144

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

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


大学生  2005-09-29 01:13:27  No: 59145

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

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

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


大学生  2005-09-29 01:16:49  No: 59146

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


επιστημη  2005-09-29 01:18:25  No: 59147

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

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

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

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


大学生  2005-09-29 01:24:46  No: 59148

#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-29 01:31:41  No: 59149

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-29 01:36:43  No: 59150

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

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


επιστημη  2005-09-29 01:40:05  No: 59151

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

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


大学生  2005-09-29 01:43:26  No: 59152

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


επιστημη  2005-09-29 01:46:43  No: 59153

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

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


大学生  2005-09-29 01:48:24  No: 59154

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加