質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

1回答

3138閲覧

opencv iOS 辺の長さを求めたい

sakittyo

総合スコア16

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

0クリップ

投稿2017/02/13 04:12

###前提・実現したいこと
opencvを使って四角形の辺の長さを求めたいです。
今、FindContoursを使い輪郭を検出しapproxPolyDPで直線近似しapprox.size() == 4で四角形を探索しています。approxの中に座標が入っていると思います。
しかしx,y座標両方入っていてどう取り出していいのかわかりません。
いい方法を教えてください。

###該当のソースコード

object

1#import <CoreMotion/CoreMotion.h> 2#import "MonochromeFilter.h" 3#import "OpenCVUtil.h" 4#import <AudioToolbox/AudioServices.h> 5@implementation MonochromeFilter 6 7 8+ (UIImage *)doFilter:(UIImage *)image 9{ 10 // CGImageからIplImageを作成 11 IplImage *srcImage = [OpenCVUtil IplImageFromUIImage:image]; 12 IplImage *grayScaleImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1); 13 IplImage *dstImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3); 14 IplImage *bin_image = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1); //cv::Mat aaa; 15 CvSeq *contours; 16 std::vector< cv::Point > approx; 17 CvMemStorage *storage = cvCreateMemStorage (0); 18 // グレースケール画像に変換 19 cvCvtColor(srcImage, grayScaleImage, CV_BGR2GRAY); 20//2値化 21 cvThreshold(grayScaleImage,bin_image,10.0, 255.0, CV_THRESH_OTSU); 22//輪郭検出 23 cvFindContours (bin_image, storage, &contours, sizeof (CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 24 std::vector<cv::Point> points; 25 cv::Mat(aaa) = bin_image; 26if(contours != NULL){ 27 for (int i = 1; i < contours->total; i++) { 28 CvPoint *point = CV_GET_SEQ_ELEM(CvPoint, contours, i); 29 points.push_back(cv::Point(*point)); 30 cv::approxPolyDP(cv::Mat(points), approx, 100, true); 31 double area = cv::contourArea(approx); 32 double Area = fabs(cvContourArea(contours, CV_WHOLE_SEQ)); 33 cv::polylines(aaa,points, true, cv::Scalar(255, 0, 0), 2); 34 contours = contours->h_next; 35 if(contours==NULL)break; 36 if (approx.size() == 4 && area > 100.0){ 37 cv::Point p1 = approx[0]; 38 cv::Point p2 = approx[1]; 39 cv::Point p3 = approx[2]; 40 cv::Point p4 = approx[3]; 41 double zzz =area; 42 } 43 } 44 } 45 cvReleaseMemStorage (&storage); 46 47 // CGImage用にBGRに変換 48 IplImage binbin_image = aaa; 49 cvCvtColor(&binbin_image, dstImage, CV_GRAY2BGR); 50 //IplImageからCGImageを作成 51 UIImage *effectedImage = [OpenCVUtil UIImageFromIplImage:&binbin_image]; 52 cvReleaseImage(&srcImage); 53 cvReleaseImage(&grayScaleImage); 54 cvReleaseImage(&dstImage); 55 return effectedImage; 56} 57 58@end 59

###補足情報(言語/FW/ツール等のバージョンなど)
opencv2.4.9
iOS 9.3.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

外していそうな気もしますが、例えば、p1.xでx座標、p1.yでy座標が取り出せますよ。

投稿2017/02/13 08:13

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakittyo

2017/02/13 17:51

知りたかったことがまさにそれでした。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問