openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#14

by damon500 » 4年前

usaoさん遅ればせながら、
自分が学不足でできればforとかwhileとか使って一つ例でも出していただけますと、感謝にたえないとおもわれるのですが、昨今コロナのせいか、想像力が不足しておりましてI(t) = (1.0-α)I(t-1) + αF( 時刻tでのカメラ画像 )が理解に追い付かないのであります、そこで甘い考えかもしれませんが、教えていただくというのは、どうなのでしょうか、たとえば[画面番号][y][x].R+何某とか、昨今コロナで時間がありましたらお願いしまーす。

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#13

by usao » 4年前

I(t) = (1.0-α)I(t-1) + αF( 時刻tでのカメラ画像 )
というのは,平均化(あなたがいうところの「RGBの各値加算して回数で割る」)処理に関して

> 時間がたりない

ということを危惧されていたようですので,代替的な処理方法の例として挙げました.
・処理時間が軽く(除算とかいらない)
・過去フレームをメモリにたくさん保持する必要もなく(「可変長がどうの」という話自体が現れない)
処理として.

この処理のことを正確に何という名前で呼ぶのかは知りませんが,処理の意味合いは式から明確だと思います.

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#12

by usao » 4年前

外野には話がよくわからんですが,直面している

> 画像検査

に合わせて検討してください.
「合わせて」とは,
今現在の「画像検査」の処理結果が良くないというときに,その原因がカメラ画像のノイズにあるのだ,ということが判明しているならノイズ除去の検討を行うべきで,
その際には,
ノイズ除去処理というのがどうあるべきか(処理速度,結果の具合,副作用の許容範囲,etc)というのは,
「画像検査」処理の内容を鑑みて判断せねばならない
ということです.

要は,

> 改善できないか

というのは,一体何をしたら「改善」が達成されるのか?という.
その{考え,方針,作戦,…}が先に無いと,成果は得られにくいのではないかと.

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#11

by damon500 » 4年前

お世話になります
damon500です。
今画像検査というのを改善できないかと、Windows10でPCカメラです
対象映像は静止画像です、RGBの各要素を比較します
2値化しないので、数あるフィルターが使用できるのか、いま調査中でして
平均化というのはどうも良くないですね、処理が良くないのか使用例を探しても無いみたいで
I(t) = (1.0-α)I(t-1) + αF( 時刻tでのカメラ画像 )は移動平均になるのでしょうか?
それも考えましたが、具体例がと
RGBの各値加算して回数で割るのはいいのですが比較する時RGBの値ではなくて
RGBの割合にしてみたら安定しないのか?とか考えたりもします
ノイズはなるべく無いほうが良いし、出来れば輝度が変わっても追従できるもの、
位置は変化してもその周りを検索してみることで対応できるのかなと思います
openCVの感想としては「良い」ですね、オープンソースとしては、優れているし
使いやすいとおもいました、PCカメラでなんか楽しいことができそうです
そこのドアを開けたらPCから「そこのドアは開けんといて!」と声がしたり
おもしろいじゃないかな。

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#10

by usao » 4年前

とりあえず,以下のようなのをやってみてはどうだろうか.簡単だし.

ある時刻tで後処理に用いる画像(≒ノイズ除去済みの画像)を I(t) と書くとき,

最初のフレーム(時刻t):
I(0) = F( 最初のカメラ画像 )

以降のフレーム:
I(t) = (1.0-α)I(t-1) + αF( 時刻tでのカメラ画像 )

※ここでF()は何らかのノイズ除去フィルタ(Median Filterとか,Bilateral Filterとか,あるいは何もしない)
※αの値は0~1. たとえば0.1とかそこらへんから適当に試せばよいかと

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#9

by usao » 4年前

元々の質問内容に関しての回答としては…
cvQueryFrame()で得られたフレーム画像のクローンをcvCloneImage()で作っては
Queue的なものに突っ込めば良い(最大保持枚数は自分で決めて,古いものを適宜popすればいいしょ)
のではないかと.
(もちろんpopしたものはcvReleaseImage()で破棄する必要がある)

ただ,目的がノイズ除去ということなので,個人的にはそんなにたくさんの(10とか1000とか)フレームを用いる必要はないと思う.
例えば,「各フレームのMedianFilter結果」を数フレーム分貯めておいてそれらを平均 とかでもまぁ大抵は十分ではなかろうか.

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#8

by あたっしゅ » 4年前

 これをきっかけに、手提鞄も OpenCV やってみようと思った。
 しかし、メイン PC の 512GB SSD がいっぱいで、1TB SSD を買ったのだけれども、
パソコンのネジが堅すぎて、いまだに交換できないでいる。電動ドライバ買えばで解決できるか ?

 画像ノイズだが、暗すぎるんじゃないの ? LED 照明で照らすとか、そういう方面の工夫は、できないのかな ?
という、第三者的意見をしてみるテスト。

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#7

by usao » 4年前

あたっしゅ さんが書きました:
4年前
openCV は、よく知らんが、こんな感じでしょうか ?
IplImage型の配列を用意してもおそらく面白いことはありません.
OpenCVのC APIでは,IplImage型を直接扱うことは無くて,常に「IplImage * 型」であれこれします.
(ライブラリの中で生成されたバッファへのポインタを扱う)

(ちなみに,IplImage型だけ作ってもヘッダ部しかない状態で,画素データが無いのでまともに使えない)

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#6

by usao » 4年前

1000枚も用いることを考えているということは,撮影対象は動きが無いシーンなんでしょうか.

やることが平均化とかであれば,
対象のフレーム画像を一度にメモリに保持せずとも
Running Average 的な処理ではダメなのか? ということを考えてはどうでしょうか.

それはそれとして,今の時代にあえて IplImage * なバージョンのCVを使う理由があるのでしょうか?
(最近の版ではもはや IplImage を使うC APIがまるごと存在してないハズ)

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#5

by damon500 » 4年前

usaoさん
openCVですが、初心者なので関数もあまりなので、努力不足ですよね、なんでも聞けばわかるというの、かんがえなおさいとと思います、結局ノイズの除去です、RGB値がフレーム毎にパラパラ変わるので、閾値を境に判断することにしても、誤作動の原因かと、それならいいカメラを使いなよ、と言われそうですが、金がないのです、PCカメラのようなもので信頼性のあるものにできないかと、それなら1枚の画像で判断するのでなく、100枚、1000枚を平均化すればましではないかと、A/Dコンバータでやるような、画像の場合そんなことすると時間がたりないですよね、FPGAかGPUで演算するならともかく、安物では無理があることに気が付きました、最初から出直しですね、ソーベルとかいうようなフィルター等で様子を見たほうがよさそうですね、要点が吹っ飛んでしまい、ふとんがふっとんだみたいなどうもすみません。

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#4

by usao » 4年前

差し支えなければ,背景(やっていること)に関しても何か簡単に説明なりがある方が
読み手もイメージしやすいのではないでしょうか.

一度に1000フレーム分の画像をメモリに保持せねばならない処理って,一体どんな処理なのでしょう?
とか疑問に思います.

あと,確証はないですが,cvQueryFrame()の戻り値は単純に保持せずにその画像のコピーを作って保持しなければならないかも?
(cvQueryFrame()は内部管理されたメモリへのポインタを返すハズ.→この関数が返したものって,いつまで有効なのか? というのが謎.)

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#3

by damon500 » 4年前

あたっしゅさま
「C/C++ の基礎を固めるほうが先」自分でもそう思います
C/C++がわかってない!C/C++の勉強から出直します。

Re: openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#2

by あたっしゅ » 4年前

コード:

void
func()
{
        const int max = 1024;
        IplImage* r = new IplImage[ max ];
        {
            XXXX* capture;
    
            for( int i=0; i<max; i++ ) {
                // frame[ i ];
                // cvQueryFrame( capture );
            }
        }
    
        delete[] r;
}
openCV は、よく知らんが、こんな感じでしょうか ?
XXXX* の所や、for の中の // の部分は、openCV や、貴方のやりたいことにあわせて、直して下さい。

メモリーの心配をする前に、C/C++ の基礎を固めるほうが先です。

openCVで画像をメモリに可変長で取り込むにはどう書けばよいでしょうか?

#1

by damon500 » 4年前

やりたい内容ですが
IplImage *frame[4];
frame[0]=cvQueryFrame(capture);
等は理解できるのですが、配列が4という固定ではなくその都度変更できるように
したいと思います
mallocで指定しないといけませんか、例えば
最初に4画面必要になったとして
for(i=0; i<4; i++)frame=cvQueryFrame(capture);
で良いかと思いますが、次に10画面必要になった場合どうすれば
よいかと、最初に10の配列をというのであれば、メモリーの心配がありまして
それが1000の場合もあり、mallocのようにその都度指定できるように
するにはどうしたら良いのでしょうか?

ページトップ