C++ OpenCV 詳しい方お力をお貸しください
Posted: 2016年1月18日(月) 17:08
初めまして、私はここではビギナーと名乗らせていただきます。
私自身C言語についてまだまだ勉強不足なところもありますが、どのような処理をすればよいのか思いつかない点も多くあります。
そのためC言語について理解がまだまだのためこの名前にしました。
数日前に一度同じ内容で投稿したのですが、コードを囲むなどのミスで、分かりにくい内容になっていました。
なので今一度同じ内容を投稿させていただきます。
私はタイトルのように紙の座標 主に紙の四隅の座標を出したいと思っています
そのため下記のような輪郭を取り、座標を取るプログラムを実行しました
しかし輪郭の複数の点がテキストファイルに保存されてしまいます.....
そこで私なりに考え、テキストファイルからX Yの最大値と最小値の組合わせを取れば、四隅の座標を取得できるのではないかと思っています。
しかしそのプログラムが上手くいかず....
少しだけでもアドバイスいただけませんか?
C++の詳しい方 ご教授ください。
また違うやり方の方が簡単や、お勧めなどあればそれでもかまいません。
よろしくお願いします。
PS.皆さん返信ありがとうございます。
私自身の思っている内容を上手く伝える事が出来ずに申し訳ありません。
もう一度ゆっくり自分自身で考えお話しします。
1.まずはじめにカメラから静止画の画像を取得します。
※画像には机と用紙が写っている画像です。
2.取得した画像を透視投影変換を使い机と垂直方向から見た画像に変換します。
※ここで歪みを取ります。
3.変換後の画像から用紙の位置が知りたいため、輪郭を取得、輪郭を取得するときに使った複数の座標点をテキストファイルに保存
4、テキストファイルには多くのxy軸の座標が書き込まれています。そのため角の座標のみを求めたいと思い、テキストファイル内の情報を整理できないかと自分自身で考えつつ、もし詳しい方がいらっしゃったら、アドバイスをいただきたいと思っています。
この後には重心を求め、画像をまっすぐ回転させようと思っています。
具体的な全体像はこのようなものだと思っています。
文章のみの説明のみでは私があまり文章を書くにが上手ではないようで、伝わらないと思いましたので、とても簡単ではありますがペイントで説明する形の図もつけたためご覧ください。
私自身C言語についてまだまだ勉強不足なところもありますが、どのような処理をすればよいのか思いつかない点も多くあります。
そのためC言語について理解がまだまだのためこの名前にしました。
数日前に一度同じ内容で投稿したのですが、コードを囲むなどのミスで、分かりにくい内容になっていました。
なので今一度同じ内容を投稿させていただきます。
私はタイトルのように紙の座標 主に紙の四隅の座標を出したいと思っています
そのため下記のような輪郭を取り、座標を取るプログラムを実行しました
#include <C:\OpenCV2.4.9\sources\include\opencv\cv.h>
#include <C:\OpenCV2.4.9\sources\include\opencv\highgui.h>
int
main (int argc, char *argv[])
{
int i;
IplImage *src_img = 0, **dst_img;
IplImage *src_img_gray = 0;
IplImage *tmp_img;
CvMemStorage *storage = cvCreateMemStorage (0);
CvSeq *contours = 0;
CvPoint *point, *tmp;
CvSeq *contour;
CvTreeNodeIterator it;
CvFileStorage *fs;
if (argc <= 2)
src_img = cvLoadImage ("../test.png", CV_LOAD_IMAGE_COLOR);
if (src_img == 0)
return -1;
src_img_gray = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1);
cvCvtColor (src_img, src_img_gray, CV_BGR2GRAY);
tmp_img = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1);
dst_img = (IplImage **) cvAlloc (sizeof (IplImage *) * 3);
for (i = 0; i < 3; i++) {
dst_img[i] = cvCloneImage (src_img);
}
// 画像の二値化と輪郭の検出
cvThreshold (src_img_gray, tmp_img, 100, 255, CV_THRESH_BINARY);
cvFindContours (tmp_img, storage, &contours, sizeof (CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
/* 輪郭シーケンスから座標を取得 */
fs = cvOpenFileStorage ("contours.txt", 0, CV_STORAGE_WRITE);
// ツリーノードイテレータの初期化
cvInitTreeNodeIterator (&it, contours, 1);
// )各ノード(輪郭)を走査
while ((contour = (CvSeq *) cvNextTreeNode (&it)) != NULL) {
cvStartWriteStruct (fs, "contour", CV_NODE_SEQ);
// 輪郭を構成する頂点座標を取得
tmp = CV_GET_SEQ_ELEM (CvPoint, contour, -1);
for (i = 0; i < contour->total; i++) {
point = CV_GET_SEQ_ELEM (CvPoint, contour, i);
cvLine (src_img, *tmp, *point, CV_RGB (0, 0, 255), 2);
cvStartWriteStruct (fs, NULL, CV_NODE_MAP | CV_NODE_FLOW);
cvWriteInt (fs, "x", point->x);
cvWriteInt (fs, "y", point->y);
cvEndWriteStruct (fs);
tmp = point;
}
cvEndWriteStruct (fs);
}
cvReleaseFileStorage (&fs);
cvNamedWindow ("Contours", CV_WINDOW_AUTOSIZE);
cvShowImage ("Contours", src_img);
cvWaitKey (0);
cvDestroyWindow ("Contours");
cvReleaseImage (&src_img);
cvReleaseImage (&src_img_gray);
cvReleaseImage (&tmp_img);
cvReleaseMemStorage (&storage);
return 0;
}
%YAML:1.0
contour:
- { x:158, y:39 }
- { x:156, y:41 }
- { x:156, y:43 }
- { x:154, y:45 }
- { x:154, y:46 }
- { x:153, y:47 }
- { x:153, y:48 }
- { x:151, y:50 }
- { x:151, y:52 }
- { x:149, y:54 }
- { x:149, y:55 }
- { x:148, y:56 }
- { x:148, y:57 }
- { x:147, y:58 }
- { x:147, y:59 }
- { x:145, y:61 }
- { x:145, y:62 }
- { x:144, y:63 }
- { x:144, y:64 }
- { x:143, y:65 }
- { x:143, y:66 }
- { x:141, y:68 }
・
・
・
・
・
しかしそのプログラムが上手くいかず....
少しだけでもアドバイスいただけませんか?
C++の詳しい方 ご教授ください。
また違うやり方の方が簡単や、お勧めなどあればそれでもかまいません。
よろしくお願いします。
PS.皆さん返信ありがとうございます。
私自身の思っている内容を上手く伝える事が出来ずに申し訳ありません。
もう一度ゆっくり自分自身で考えお話しします。
1.まずはじめにカメラから静止画の画像を取得します。
※画像には机と用紙が写っている画像です。
2.取得した画像を透視投影変換を使い机と垂直方向から見た画像に変換します。
※ここで歪みを取ります。
3.変換後の画像から用紙の位置が知りたいため、輪郭を取得、輪郭を取得するときに使った複数の座標点をテキストファイルに保存
4、テキストファイルには多くのxy軸の座標が書き込まれています。そのため角の座標のみを求めたいと思い、テキストファイル内の情報を整理できないかと自分自身で考えつつ、もし詳しい方がいらっしゃったら、アドバイスをいただきたいと思っています。
この後には重心を求め、画像をまっすぐ回転させようと思っています。
具体的な全体像はこのようなものだと思っています。
文章のみの説明のみでは私があまり文章を書くにが上手ではないようで、伝わらないと思いましたので、とても簡単ではありますがペイントで説明する形の図もつけたためご覧ください。