<実行した環境>
- Windows10 64bit
- visual studio 2017
- opencv 3.4.1
こちらのサイトを参考にしました。http://www.cellstat.net/centroid/
こちらのプログラムに関しての質問です。
#include <stdio.h> #include <opencv/cv.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgcodecs/imgcodecs.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> using namespace cv; int main(){ Mat img = imread("sample.jpg", IMREAD_GRAYSCALE); Mat img2 =img.clone(); vector<vector<Point> > contours; findContours(img2, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); double max_size=0; int max_id=-1; for(int i=0; i<contours.size();i++){ if(contours[i].size()>max_size){ max_size=contours[i].size(); max_id=i; } } Moments mu = moments( contours[max_id]); Point2f mc = Point2f( mu.m10/mu.m00 , mu.m01/mu.m00 ); circle( img, mc, 4, Scalar(100), 2, 4); printf("x: %f y: %f", mc.x, mc.y); imshow("img",img); waitKey(0); return 0; }
のプログラムに関して
findContours(img2, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); ```のcontoursは検出した輪郭を保存する変数とのことですが、これは変数名がcontoursで何バイトかのメモリを占めているということでしょうか? そして、変数名contoursが占めているメモリに
double max_size=0;
int max_id=-1;
for(int i=0; i<contours.size();i++){ if(contours[i].size()>max_size){ max_size=contours[i].size(); max_id=i; } }
の計算結果の値を代入して、その輪郭の値から面積を求める為に関数Momentsを使った。
Moments mu = moments( contours[max_id]);
最後に関数Momentsにより求めた面積から重心を求めるために
Point2f mc = Point2f( mu.m10/mu.m00 , mu.m01/mu.m00 );
を使ったと考えているのですが、正直以上のような解釈であっているかわかりません。 実行は出来ましたがちゃんとプログラムを理解したいと思い質問しました。 間違っていましたらどうかご指導お願いいたします。 載せましたプログラムで重心を求めた結果の画像を載せます。 一枚目はボールペンです。  二枚目はペットボトルです。  画像からの重心を求めたので正しいかどうかはわかりませんが、ボールペンに関してはあながち間違ってないように思えます。(実験しました。) 編集 処理を読んでいてもなぜ重心が求まるのか理解できません。 直球に言いますと、なぜ、あのプログラムから重心が得られるのか原理が知りたいです。 三角形や円なら数式を使えば重心を簡単に求められますが、歪なものなどは数式が立てにくく常に一定の形の物の重心を求める訳ではありません。 そのため、数式を使わずに、載せたプログラムだけで様々な形の物の重心が求まる理由が知りたいと思いました。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/06 09:48
2018/06/06 09:58
2018/06/06 10:10
2018/06/06 23:31 編集
2018/06/06 22:57 編集
2018/06/06 22:59 編集
2018/06/06 23:09
2018/06/06 23:32
2018/06/07 00:21
2018/06/07 01:40
2018/06/07 02:49
2018/06/07 08:33