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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3488閲覧

opencv.js (asm.js版)におけるconnectedComponentsWithStatsの結果を正しく取得できない

ssmxgo

総合スコア178

OpenCV

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/08/02 23:54

編集2018/08/03 02:32

opencvのJavaScript版でラベリングを行おうとして基本的なところで躓いています。
当方jsもopencvも初心者でこちら(前回の質問)で画像のピックアップを模索していましたが、躓き部分が質問のレベルに達っせず、新規質問として改めさせていただきます。

前提

PythonからのJavaScriptへのビルド?は成功せず、githubを調べたところ、asm.js版のopencv.jsが公開されていて、そちらを利用したところopencv.jsが機能を始めたので良しとしました。(探してもnode.js版とasm.js版、もしくはver3.xより古いものしかない)
https://github.com/huningxin/opencv.js/tree/master/build/asm.js/opencv.js
こちらを拝借。
asm.jsは、対応環境でなければjavaScriptのサブセットとして動くということなので、問題は無いと思ってます

テスト環境と実際のプログラム

テストしてる環境はこちらです

以下要約

html

1 <script src="https://cdn.rawgit.com/ssmxgo/opencv.js/ff19899a/build/asm.js/opencv.js" type="text/javascript"></script>

JavaScript

1 // 画像の読み込み 2 let mat = cv.imread(imgElement); 3 // 変換先(処理をかけた画像)の定義 4 var dst_gray = new cv.Mat(); 5 var dst_binary = new cv.Mat(); 6 var label = new cv.Mat(); //ラベル画像(CV_32SC1 or CV_16UC1) 7 var stats = new cv.Mat(); //バウンディングボックスを形成する値と面積値 8 var centroids = new cv.Mat(); //重心(x,y)(CV_64FC1) 9 10 11 // グレースケール変換 12 cv.cvtColor(mat, dst_gray, cv.COLOR_RGBA2GRAY, 0); 13 //二値化 14 cv.threshold(dst_gray, dst_binary, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU); 15 16 // ラベリング処理 17 cv.connectedComponentsWithStats(dst_binary, label, stats, centroids, 8, cv.CV_32S); 18 19 console.table(label); 20 console.table(stats);

成功したこと

画像をopencvによるMat形式にセット…①
グレイスケール化(モノクロ化)
2値化(閾値を基準に白と黒の2色化)…②
です。
①…イメージ説明
②…イメージ説明

できないこと

本題ですが、次にラベリングを行い画像の要素の取得?、その後に領域検索?みたいなことをする予定なのですが(素人でしてやりながらの理解になります)、その前提としての

connectedComponentsWithStats

がうまく値を取得できていないようです(できているかもしれませんが解析する力がありません)

上がlabel,下がstatus をconsole.talbeで出力したものですがわけわかりません(汗)
配列でそれぞれの画像のプロバティが戻ってくるようなイメージなのですが…(そもそもその認識が間違ってるかもしれませんが)
イメージ説明
※ちなみにFirefoxを使ってますが、chromeだと若干レスポンスが違うように思います

ひっかかり

こちらのページを参照していますが、Pythonはよくわからないながら

Python

1 int nLab = cv::connectedComponentsWithStats(src, LabelImg, stats, centroids); 2 3 // ラベリング結果の描画色を決定 4 std::vector<cv::Vec3b> colors(nLab); 5 colors[0] = cv::Vec3b(0, 0, 0); 6 for (int i = 1; i < nLab; ++i) { 7 colors[i] = cv::Vec3b((rand() & 255), (rand() & 255), (rand() & 255)); 8 } 9 10 // ラベリング結果の描画 11 cv::Mat Dst(src.size(), CV_8UC3); 12 for (int i = 0; i < Dst.rows; ++i) { 13 int *lb = LabelImg.ptr<int>(i); 14 cv::Vec3b *pix = Dst.ptr<cv::Vec3b>(i); 15 for (int j = 0; j < Dst.cols; ++j) { 16 pix[j] = colors[lb[j]]; 17 } 18 }

ラベリング結果の描画色を決定 というところはさっぱりわからないのですが、その下のラベリング結果の描画では、
LabelImg.ptr<int>(i)
みたいな表現が出てきます。
推測ですが、LabelImg.ptr(i)をforで回している考えると、LabelImg.ptrは配列であるべきなのかな?と思ったりするわけですが、undefinedが返されてます。
つまりそもそも connectedComponentsWithStats の設定が失敗しているのかな?と。

あと、付随しますが

javascript

1 var label = new cv.Mat(); //ラベル画像(CV_32SC1 or CV_16UC1) 2 var stats = new cv.Mat(); //バウンディングボックスを形成する値と面積値 3 var centroids = new cv.Mat(); //重心(x,y)(CV_64FC1)

とコメントにありますが、いずれもデータ・タイプを設定していないところに問題があるのか?。そもそも設定の仕方もわからないですが。


結果的に、こちらのページで紹介されているようなステップにつなげる予定です。

こちらはこちらでpythonさっぱりでやろうとしてることはなんとなくわかりつつも、コードが解析できませんが、それは混沌とさせてしまうため、ここでは割愛いたします

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

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

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

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

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

oikashinoa

2018/08/03 00:34

テストで使っている画像もアップした方がいいと思います。あと、opencvでラベリングする時、白黒反転させていたページを見た気がします。(白を物体として認識しようとする?)公開できない入力画像なら差支えのないものでテストして結果が一緒ならそれをここにアップすると良いですよ。
ssmxgo

2018/08/03 00:48 編集

ありがとうございます!! このあと直ぐに画像とログ?画面を貼り付けます
guest

回答2

0

opencv.js tutorials で検索すると公式のサンプル集がありました。

これで慣れてから作ると良さそうです

投稿2018/08/10 03:39

編集2018/08/10 04:12
oikashinoa

総合スコア2826

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

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

ssmxgo

2018/08/10 05:34

なるほど!その発想なかったですね Pythonばかり調べてました
guest

0

ベストアンサー

推測で書きます。あと、参考にされているソースは多分c++ですよ。

C++

1 int nLab = cv::connectedComponentsWithStats(src, LabelImg, stats, centroids); 2 3 // ラベリング結果の描画色を決定 4 std::vector<cv::Vec3b> colors(nLab); 5 colors[0] = cv::Vec3b(0, 0, 0); 6 for (int i = 1; i < nLab; ++i) { 7 colors[i] = cv::Vec3b((rand() & 255), (rand() & 255), (rand() & 255)); 8 }

nLabにラベリングした結果の個数が入る
cv::Vec3b(0, 0, 0)はRGB指定で黒
colors[i]にランダムで適当に色を指定していく(ラベリング数分設定)

OpenCV.js TESTv2ならchromeで動いたので動かしてみました。

js

1 // ラベリング処理 2 let nLab =cv.connectedComponentsWithStats(gray,label, stats, centroids, 8, cv.CV_32S) 3 console.log(nLab);

①の画像使って nLab > 8 となりましたので、多分あっている。

js

1 // ラベリング処理 2 let nLab =cv.connectedComponentsWithStats(gray,label, stats, centroids, 8, cv.CV_32S) 3 console.log(nLab); 4 console.log(gray); 5 console.log(label); 6 console.log(stats); 7 console.log(centroids);

…grayとかの値を見たけどよく分かりません。今日はねます。

投稿2018/08/03 16:58

oikashinoa

総合スコア2826

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

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

ssmxgo

2018/08/05 19:24

おおおおおお、これは! ありがとうございます 確認してみます 補足 先の質問でPythonで記述してみて、この参照はPythonじゃ無いと、わかりました 一難去ってまた一難。共有サーバーにopencvを入れることに困難を期す、です
ssmxgo

2018/08/10 03:16

遅くなりました ちゃんと8個かえってきてますが、それ以外は謎 もしかしたら、JS版のバグなんでしょうかね… ちょっとお手上げでした ありがとうございました
oikashinoa

2018/08/10 03:31

バグの可能性は低いと思います(opencvを機械的にコンバートしたのがopencv.jsだから) 使い方というか書き方の問題かな。引数の渡し方とか。 jsfiddle消さないでくださいね。しばらく試してみます。
ssmxgo

2018/08/10 03:42

あ、もうぜひぜひ わたしではハードルが高かったので泣く泣くPythonを探っています。 でも、可能であればJSでも使えるようになりたいばかりか、これって情報が少なすぎるのでとても有益な情報ですね。しかもasm.jsで実現してるとなれば今後の期待大ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問