AppSetNetDev

アプリ開発のメモなどを残します。

GoogleAdsenseからリジェクト食らったww

突然googleさんから連絡があって、公開してたアプリhttps://itunes.apple.com/jp/app/scanf/id1341688541が何故かリジェクト扱いになった。

何週間前から何度かgoogleに解除をお願いしてたけど、ダメっぽいw 何もしてないんだけどな。。。(間違いで何回かクリックしたことはあり)

愚痴ってても仕方ないのでnend ↓ でも埋め込もうと思います。

nend.net

このアプリでは利益を求めてるわけじゃないので、広告なしでもいいんだけどそれだとStoreKitに触れる機会がなくなってしまう。

技術的にはStoreKitに触る環境は必要だと思ってる。 ちょっと見てない間にものすごく進化するからw

審査通ったらアプリ更新してお知らせします。

iOSシミュレータのパスについて

iOSの開発ではiOSシミュレータが必須です。

全部実機でやってるぜヒャッハー!って人もいるかと思いますが、実機だと自前のフレームワークやらファイルやらがちゃんと意図した場所に入っているかどうか確認が面倒です。なによりも自分は全iPhone/iPadを揃えられるほど裕福ではないのでシミュレータ必須です。必須ですよね?

で、このパスは次の場所になります。

/Users/USER_NAME/Library/Developer/CoreSimulator/Devices

この直下にデバイスごと、iOSごとのパスがずらずらっと並んでいます。

ちなみにユーザ直下のLibraryフォルダはデフォルトで不可視フォルダとなっていますので、ここへアクセスするには次の三つの方法があります(多分他にもあるけど割愛)。

  1. Finderを開き、CMDキー + SHIFTキー + .(ピリオド) キーを押下する(Mac10.13のみ)。

  2. Finderを開き、移動 > フォルダへ移動 として表示されるテキストフィールドに上記パスを入力する。

3.ターミナルで

$ defaults write com.apple.finder AppleShowAllFiles TRUE

とする。

上記どれかを行なってFinderで開くと、次のような画面が視界に飛び込んできます

f:id:AppSetNetDev:20180228145053p:plain

アクセスさせる気があるのか、開発させる気があるのかと疑ってしまうようなフォルダ名ですが、何かしら理由があるのでしょう。 このフォルダ中のdevice.plistでデバイスのタイプ、iOSのバージョンなどがわかります。

f:id:AppSetNetDev:20180228145306p:plain

例えば上記だと

 deviceType : com.apple.CoreSimulator,SimDeviceType.iPad-Air

 runtime : com.apple.CoreSimulator.SimRuntime.iOS-9-3

とありますのでiPad-AiriOS 9.3のシミュレータだと分かるわけです。

よって、ご自身の作成されたiOSアプリのフォルダ構成などを確認する場合は、このdevice.plistの中をちまちまと確認...

できるわけねーだろ!!!ヾ(`Д´)ノ"

というわけでここから本題です。

毎回毎回起動させたシミュレータ+iOSバージョンのフォルダを探すとなると面倒なので、一括でエイリアスを作成するRubyスクリプトを組みました。 空き時間中にやっつけで作ったので、作りが粗いのはご勘弁。

githubにアップしてあります。

github.com

取得したiOSSimulatorList.rbを適当なエディタで開き、

DEVPATH = "/Users/xxxxx/Library/Developer/CoreSimulator/Devices"

となっている箇所を変更してください(xxxxxを正式なユーザー名に)。

保存して適当なフォルダで実行します。

$ ruby iOSSimulatorList.rb

そのフォルダ以下にエイリアスができます。

f:id:AppSetNetDev:20180228151938p:plain

なお、デスクトップとかで実行するとえらいことになるので(自滅したw)、どっか適当なフォルダを作ってその中でやるのが一番ではないかと思います。

他の人たちはどうやってるんだろ?と思ってググると、毎回Documentフォルダをログ出力してそれを開くという解決策もありました。

そっちの方がスマートかも(おいw)。

最後までご覧いただき、ありがとうございました。

たのしいRuby 第5版

たのしいRuby 第5版

ScanFについて

スキャナーアプリケーションを開発(iOSアプリ)していますので、簡単な機能説明などを書いていきます。

何をするアプリ?

画像をスキャン > 切り抜き > 画質補正 > 保存(アップロード)するアプリです。

画像切り抜き

こんな感じで写っている画像ですが、四隅を指定して切り抜くことでまっすぐに補正して切り抜くことができます。 最初に表示した際に自動で境界を判断して切り抜くようにしていますが、精度はイマイチです...

f:id:AppSetNetDev:20180228132603p:plainorz

四隅を指定して画面右上のハサミボタンを押下すると切り抜きされます。

f:id:AppSetNetDev:20180228132733p:plain

画質変換

上の写真ではアスペクト比と明るさを若干変えてあります。

モードによって変えられるパラメータが異なります。上記のようなカラーモードの場合は次のパラメータを変更できます。

1.明るさ

2.コントラスト

3.シャープネス

変更した画像の保存

切り抜いた画像はファイルとしてアプリ内に保存できます。

後から画質変更を行うことも可能です。

フォルダ -> 複数アイテムとして保存できます。

f:id:AppSetNetDev:20180228133049p:plain

画像のアップロード

変更をかけた画像は他のアプリへの転送や、プリンタでの印刷が可能です。

f:id:AppSetNetDev:20180228133319p:plain

進捗

おおよその実装が終わり、現在微調整を進めているところです。

リリースできたらまたここでご案内します。

最後までご覧いただき、ありがとうございました。

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)

Swift4でOpenCV3.4を使ってみる

何番煎じかわかりませんがSwift4にOpenCV3.4を組み込んで、画像の変更をしてみます。

OpenCVのダウンロード

まずはOpenCVフレームワークをここからダウンロードしてください。iOS Packという名前をクリックするとダウンロードが開始されます。

opencv.org

プロジェクトの作成と構成変更

次にプロジェクトを作成します。

xcode >File > New > Project を選択してください。

ここでプロジェクト名はopencv_testとしました。

ダウンロードされたopencv-3.4.0-ios-framework.zipを解凍するとonepcv2.frameworkが展開されるので、これをそのままプロジェクトのフォルダに放り込みます。  f:id:AppSetNetDev:20180228104232p:plain

このままではビルドしても組み込まれないので、xcodeにも放り込みます。 ドラッグ&ドロップした際に次のようなモーダルが表示されますが、[Destination: Copy items if needed]にチェックがあることを確認してください。   f:id:AppSetNetDev:20180228105212p:plain

f:id:AppSetNetDev:20180228104859p:plain できました。

OpenCVManagerの作成

OpenCVとSwiftを連携させるには、Obhejective-Cのファイルが必要になりますので、新しいクラス [OpenCVManager]を作成します。 上記に見えているフォルダopencv_testを右クリック > New File...  で表示された画面の中からObjective-Cを選択してください。 これにOpenCVManagerという名前をつけて保存します。

保存時には

 FIle: OpenCVManager

 FileType: Empty File

 Class: NSObject

としてください。また、保存する際にBridging-Header.hを作成するか否かというダイアログが表示されますので、迷わず Create Bridging Headerをクリックして下さい。

f:id:AppSetNetDev:20180228110314p:plain

これでOpenCVManager.mとopencv_test-Bridging-Header.hがプロジェクト内に生成されます。OpenCVを使用する際にはC++を使うことが多いのでOpenCVManager.mの拡張子を.mmに変更しておいてください。

 同様の手順でOpenCVManager.hを追加します。

この場合はBridging Headerについての問い合わせは表示されません。

 ここまでの手順で、プロジェクトの構成はこんな感じになっているはずです。

f:id:AppSetNetDev:20180228111138p:plain

  なってます? なってなかったら最初から見直しましょう。

  ここからはコードを書いていきます。

コード

opencv_test-Bridging-Header.h

#import "OpenCVManager.h"

OpenCVManager.h

#import <UIKit/UIKit.h>

@interface OpenCVManager : NSObject
+ (UIImage*)test:(UIImage*)inImage;
@end

OpenCVManager.mm

#import "OpenCVManager.h"
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>

@implementation OpenCVManager

+ (UIImage*)test:(UIImage*)inImage
{
    cv::Mat img_Mat;
    
    UIImageToMat(inImage, img_Mat); // (1)

    cv::cvtColor(img_Mat, img_Mat, CV_BGR2GRAY); // (2)

    return MatToUIImage(img_Mat); // (3)
}
@end

  上記コードはUIImageを引数で受け取り、

  1. UIImageをOpenCVで扱うためのMat形式に変換

2.変換したMat形式の色をグレースケールに変換

3.Mat形式をiOSで扱うためのUIImageに変換

して返すコードになります。

UIの設定

プロジェクト作成時に生成されたViewControllerを次のように変更します。

あ、そうそう。

その前に適当な画像を取得してプロジェクトのAssets.xcassetsに入れといてください。 ここでは例の画像(レナ (画像データ) - Wikipedia)を拾ってきてlenaという名前で保存しています。

class ViewController: UIViewController
{
    @IBOutlet var _ImageView : UIImageView!
    @IBOutlet var _Switch : UISwitch!

    override func viewDidLoad()  { /* 省略 */ }
    override func didReceiveMemoryWarning() { /* 省略 */ }

    @IBAction func myAction()
    {
        var img =  UIImage.init(named: "lena")
        
        if (self._Switch.isOn == false) {
            img = OpenCVManager.test(img)
        }
        
        self._ImageView.image = img
    }
}

最後です。

Main.storyboardを開いて表示されているView Controller Scene > View Controller > View にUIImageVIew とUISwitchを追加しましょう。 追加したコントロールをViewControllerのOutletに紐づけ、UISwitchのアクションをmyActionに紐付ければ完成です。

f:id:AppSetNetDev:20180228120027p:plain

ここまでのプロジェクトをgithubにアップロードしてありますのでご確認ください。

なお、opencv2.frameworkは非常に大きいので、プロジェクトに含めていません。

各自でダウンロードの上、opencv_test/opencv2.framework.dummyと置き換えてください。

github.com

最後までご覧いただきありがとうございました。