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

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

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

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

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3610閲覧

openCVを用いた画像処理アプリの作成

SKMT

総合スコア57

OpenCV

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

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/10/25 05:48

編集2019/11/12 04:39

前提・実現したいこと

openCVを使って矩形検出するiPhone用アプリを作りたいです。

発生している問題・エラーメッセージ

矩形検出の部分で二値化して輪郭検出することができたのですが、参考にしているサイトのように
元画像に赤枠で検出することが出来ません
真っ黒に白で矩形検出した画像になってしまいます

該当のソースコード

objectiveC

1#import "opencv2/opencv.hpp" 2#import "opencv2/highgui/ios.h" 3#import "openCVer.h" 4 5@implementation openCVer 6 7-(UIImage *)toGray:(UIImage *)input_img { 8 // 変換用Matの宣言 9 cv::Mat gray; 10 // input_imageをcv::Mat型へ変換 11 UIImageToMat(input_img, gray); //---② 12 13 cv::cvtColor(gray, gray, CV_BGR2GRAY); //---③ 14 cv::threshold(gray, gray, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 15 16 // cv::threshold(gray, gray, 200, 255, CV_THRESH_TOZERO_INV ); 17 // cv::bitwise_not(gray, gray); // 白黒の反転 18 cv::threshold(gray, gray, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 19 20 std::vector<std::vector<cv::Point>> contours; 21 std::vector<cv::Vec4i> hierarchy; 22 cv::findContours(gray, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_TC89_L1); 23 24 int max_level = 0; 25 for(int i = 0; i < contours.size(); i++){ 26 cv::drawContours(gray, contours, i, cv::Scalar(255, 0, 0, 255), 3, CV_AA, hierarchy, max_level); 27 } 28 29 max_level = 0; 30 31 for(int i = 0; i < contours.size(); i++) { 32 // ある程度の面積が有るものだけに絞る 33 double a = contourArea(contours[i],false); 34 if(a > 15000) { 35 //輪郭を直線近似する 36 std::vector<cv::Point> approx; 37 cv::approxPolyDP(cv::Mat(contours[i]), approx, 0.01 * cv::arcLength(contours[i], true), true); 38 // 矩形のみ取得 39 if (approx.size() == 4) { 40 cv::drawContours(gray, contours, i, cv::Scalar(255, 0, 0, 255), 3, CV_AA, hierarchy, max_level); 41 } 42 } 43 } 44 45 cv::Point2f src[4]; // 変換元 46 cv::Point2f dst[4]; // 変換先 47 cv::Mat perspective_matrix = cv::getPerspectiveTransform(src, dst); 48 cv::warpPerspective(gray, gray, perspective_matrix, gray.size(), cv::INTER_LINEAR); 49 50 input_img = MatToUIImage(gray); //---④ 51 52 return input_img; //---⑤ 53} 54 55@end 56

###実行結果
cv::Point2f src[4]; // 変換元
cv::Point2f dst[4]; // 変換先
cv::Mat perspective_matrix = cv::getPerspectiveTransform(src, dst);
cv::warpPerspective(gray, gray, perspective_matrix, gray.size(), cv::INTER_LINEAR);

以外の実行結果です
上の4行まで実行すると多分この真ん中の黒い矩形を検出してると思うのですが、
ただの真っ黒い画像になってしまいます。

イメージ説明

試したこと

https://dev.classmethod.jp/smartphone/avfoundation-opencv-findcontours/
https://dev.classmethod.jp/smartphone/ios-avfoundationavcapturevideodataoutput-opencv/
https://qiita.com/tomoyuki_HAYAKAWA/items/1e214b21725f45269807

上記サイトを参考に作りました。

補足情報(FW/ツールのバージョンなど)

swift4、opencv2.x、Xcode9

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

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

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

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

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

Ryupe

2019/11/12 00:45

> 元画像に赤枠で検出することが出来ません > 真っ黒に白で矩形検出した画像になってしまいます 現状だとどのような結果になりますか? 画像を添えていただけませんか?
guest

回答1

0

ベストアンサー

希望している実行結果はカラー画像に赤い矩形でということですよね?
そうでしたら、矩形描画するコードのところで描画先をgrayを指定しているのが原因です。
grayは二値化された画像なので白か黒かしか情報を持っていません。

直すとしたら描画先をカラー画像であるinput_imgに指定することでしょうかね。
その前にcolor_imgを作成する必要があります。

cv::Mat color_img;

描画コードはカラー画像を指定する。

cv::drawContours(color_img, contours, i, cv::Scalar(255, 0, 0, 255), 3, CV_AA, hierarchy, max_level);

swiftは書いたことが無いので足りないところとかあるかもしれませんが考え方はこの通りだと思います。

投稿2019/11/13 02:20

Ryupe

総合スコア426

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

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

SKMT

2019/11/13 06:04

回答ありがとうございます。分かりやすい説明ありがとうございます。思った通りに表示することが出来ました。あとアプリはswiftなのですが、openCVの部分はobjective-C?だと思うので言われた通りに直すことで上手くいきました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問