前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー