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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

578閲覧

[Xcode Swift OpenCV]SwiftからObjective-Cに画像を渡すとき.pngや.bmpが渡せていない

ghana

総合スコア18

OpenCV

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/07/10 07:05

###前提・実現したいこと
・問題点
OpenCVを用いた画像処理アプリケーションを作っています。
OpenCVを利用するために画像をSwiftからObjective-C++に渡しているのですが、どうやら.jpg以外(.pngや.bmp)渡せていないような現象が起きています。画像を一度渡してcv::Matに変換してからUIImageに変換し直して画像を返すテスト関数を用いているのですが、返してもらった画像を画面に出力しようとしても反応がなく白色のままです。また、Objectibe-C++での関数内で受け取った画素にアクセスするコードを書いても画素にアクセスできない(全て0になっている)ことから画像自体渡せていないのではないかと推察しています。

.jpgの場合はうまくいくのですが、.pngや.bmpの場合ですと何か処理をしないといけないのでしょうか?
画像ファイルはファイル共有に置いてあります。
お手数をおかけしますがご教授お願いいたします。

・実現したいもの
ファイル共有で追加した画像(.pngもしくは.bmp)をObjective-C++で利用できるようにしたい。

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

var FileImage:UIImage! //ドキュメントパスの取得 let documentPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as String //ファイルの場所(textは画像ファイル名) let imageFilePath = documentPath + "/" + text + ".png" //パスから画像を読み込む FileImage = UIImage(contentsOfFile: imageFilePath) // // 中間 省略 // //Objective-C++の関数に画像を渡す ここが問題の箇所(画像が渡せていない) let image = self.detector.imageTest(FileImage) self.areaImageView.image = image

.mm

//画像受け渡しテスト関数 -(UIImage *)imageTest:(UIImage *)FileImage{ cv::Mat srcImage; //UIImageからMatに変換 UIImageToMat(FileImage,srcImage); int num = srcImage.at<cv::Vec3b>(70,70)[0]; //VisualStudioで確認した座標を入れても全部0になっていた 70,70は一例です //MatからUIImageへ変換 UIImage *dstImage = MatToUIImage(srcImage); return dstImage; }

下の図は.jpgと.pngをテスト関数に渡して返してもらった画像を画面に出力した時の様子になっています。画面上部の画像はカメラ画像となっているので気にしないでください。

![イメージ説明
.pngを使った時の様子

イメージ説明
.jpgを使った時の様子

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

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

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

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

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

fuzzball

2018/07/10 07:14

まずFileImageが正しいかどうか確かめて下さい。
ghana

2018/07/10 07:19

お返事ありがとうございます。FileImageが正しいかどうかというのはFileImage=UIImage(contentsOfFile: imageFilePath)が正しく行われているかどうかの確認でしょうか?それでしたら、関数を通さずにそのまま画面出力を行ったところきちんと出力できていたので.png画像自体はswift側に読み込まれていると思います。
u39ueda

2018/07/10 07:39

imageTest:関数で入力画像をそのままreturnした場合はどうなるでしょうか?
fuzzball

2018/07/10 07:41

「渡せていない」ことはないと思うので、そこのチェックは飛ばします。(どうしてもそこを疑うのでしたら、変換前のピクセルデータを調べて下さい)で、各画像の色数やチャンネル数は同じなのでしょうか?変換後の色数やチャンネル数も調べてみて下さい。
ghana

2018/07/10 08:07 編集

>u39uedaさん お返事ありがとうございます。テスト関数の部分をreturn FileImage;のみにしてみたところ、どちらも出力できていました(17:07修正)
ghana

2018/07/10 07:57

>fuzzballさん 変換前の.png画像は自作のWindowsGUIで作成したMatをBitmapに変換してからpngとして保存しているので、Mat宣言時にはCV_8UC1として画像を作成しています。そして関数に渡した時の画像のチャンネル数を調べたところ「4」として出力されていました。このチャンネル数などの不一致が今回の現象を引き起こしているのでしょうか?
ghana

2018/07/10 08:09

>fuzzballさん 追記なのですが、変換前の画像をVisualStudioでチャンネルを確認したところ「3」でした
fuzzball

2018/07/10 08:34

正しく変換されるjpgのときと比較すれば、どの辺が原因かは分かると思います。(グレースケール情報がどこかで消失してる感じ)
ghana

2018/07/10 08:55

>fuzzballさん 入力画像を少し編集してiPhoneの形合うように画像を回転させてから(x、yを逆にした)関数に読み込ませたらうまく表示されました。原因はわからないのですが、一応解決済みにしたいと思います。ここまでお付き合い、アドバイスありがとうございました。
guest

回答1

0

自己解決

画像をiPhoneの形に合うように回転させてから読み込んだらうまく行きました。

投稿2018/07/10 08:56

ghana

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問