最近OpenCVの勉強を始めました。
読み込んだ画像を2値化し、その画像内の点の重心を求めたいのですが、座標設定からうまくいきません。
お手数ですが教えてください。
'うまくいかない'を説明してください。
# そもそもそれはプログラム上の問題ですか?
すいません。詳しく言うと
うまくいきません→やりかたがわかりません。です。
重心を求めるプログラムがわからないのです。
読み込んだ画像は小さな点があるだけです。
> 画像内の点の重心を求めたいのですが
…わかんない。
点に重さなんかあるの? 点の重心ってナニ? 重心はその点そのものじゃなくて?
点には多少の大きさと歪みがありまして、研究室の教授が言う曰く
「点のX座標の平均と、Y座標の平均を出すことで重心の座標が求められる。」と・・・
ここで言う重心とは剛体ではなく、質点の重心です。
わかりにくい質問で申し訳ございません。
え? じゃ答出てんじゃん。
「点のX座標の平均と、Y座標の平均を出すことで重心の座標が求められる。」
N個の点の集合 point[N] があるんなら、
Σpoint[i](i=0..N-1) を N で割ればいい。
OkWebにも同様の質問「オブジェクトの重心について」がありました。
http://okweb.jp/kotaeru.php3?q=1678415
マルチポスト? 偶然? 同じ課題を与えられた別人?
# マルチポストなら嫌われます。ご注意を。
ありがとうございます。初心者ですみません。
その点の集合をx座標、Y座標で抽出するにはどうしたらいいでしょうか?
また画像の左上を原点にしたいのですが、それは設定する必要はあるのでしょうか?
参考書もなく独学でやっているので、わかりにくくてごめんなさい。
上のサイト見ました。
偶然です。しかも同じ日にというところに驚きです。
> その点の集合をx座標、Y座標で抽出するにはどうしたらいいでしょうか?
2値化された「処理の入力となるデータ」がどんな形で
与えられているのか分からぬ限り答えようがありません。
> また画像の左上を原点にしたいのですが、それは設定する必要はあるのでしょうか?
質問の意味が理解できません。
「画像の左上を原点にしたい」ならすればいい。
左上が(0,0)となるように平行移動するだけ。
#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に分けて座標をもとめたいのですが・・・
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で割れば平均。
あっざーーーーーーーす!!
本当に感謝します。
またなんかあったら書き込みますので面倒とは思いますがよろしくお願いします。
いたたたた…もしかして教えすぎた?
# てゆっか、わからんかった?
鵜呑みにせんと、良く噛んでお召し上がりください。
ちょうど良い噛み具合です。
本当は教えすぎてもらいたかったのですが・・・
できたらお願いします。
> できたらお願いします。
なにを?
重心を求めるネタはこれで全部だろうから「教えすぎ?」と感じました。
# 次回は注意しよう。あなたのためにならない。
そうですね。ほんとうにありがとうございました。
本当に感謝しています。
ツイート | ![]() |