標準のC言語での画像の読み込み、編集方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
kerotan0820
記事: 91
登録日時: 10年前
住所: 東京都
連絡を取る:

標準のC言語での画像の読み込み、編集方法

#1

投稿記事 by kerotan0820 » 8年前

今現在、C言語による画像の処理について学んでいます。

最終目的は大漁の画像、1枚1枚の色を識別して、ある色なら0、あるい色なら1といった具合にテキストファイルに出力することを目標としています。

"大漁の画像データ" とは、下記URLの動画の全フレームを画像に変換したものです。(画像への変換はフリーソフトを利用します)


動画の内容は、ストロボの点灯、消灯をコントロールすることでアニメーション的な動作をさせています。
具体的には、
変換した画像のストロボが点滅している部分のみを対象とし、10×25に分割。
点灯(白)と消灯(黒)を識別し、それぞれ0、1というデータとしてテキストファイルに出力したいと思っております。
(ストロボの点灯に関係のない余白はプログラムで簡単に除外出来るのであればしたいと思いますが、ややこしくなるようでしたら編集ソフトで動画のトリミングを行うつもりです)

これらの目標を成し遂げるために何から勉強すれば良いのか分からず、様々なサイトを巡ってみました。
そして、こちらのサイトで今現在勉強しています。
http://pen.agbi.tsukuba.ac.jp/~RStiger/ ... 6%FE%CC%E7

こちらのサイトでは、linux環境を対象としておりプログラムはC言語であるものの、わざわざ1枚1枚の画像をコマンドラインから入力して処理をするという方法が紹介されています。
しばらくの間、linux環境をPcに導入した上でコマンドラインからの実行を行って来ました。

しかし私は、数万に及ぶフレーム数の画像をすべて処理しなくてはならないため、このサイトで学んでいても結果には繋がらない気がしています。

例えば、このサイトの画像を切り出してみようという単元では、画像の読み込みに
fread 関数を利用していますが stdin (標準入力)からデータを読み込んでいます。

そうではなく、画像データをプログラム上で直接指定し、ファイルをオープンしたところで画像を認識。
テキストファイルに書き込み、画像データをクローズ、テキストファイルをクローズ。

このような処理をしたいと思っております。
ふと、テキストファイルやバイナリファイルの読み書きのプログラムを思い出しましたが、画像データを読み込み、画像を書き出すとなると、テキストファイルの読み書きなどとは話が変わってくるのではないかと思います。

画像処理が全くの初心者のため、手が付けられず困っております。

実は、この画像処理の学習はLED掲示板を点滅させるためのデータ作りに過ぎず、あまり時間に余裕がありません。
少しでも具体的なお話をお聞かせいただけると幸いです。
よろしくおねがいします。

[環境]
C言語
Windows 7
VC++ 2008
けろけろにゃー (」・ω・)」うー!

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: 標準のC言語での画像の読み込み、編集方法

#2

投稿記事 by h2so5 » 8年前

標準入出力だと一見、大量のファイル処理に向かないように思えますが、
ちょっとコマンドを工夫すればバッチ処理ができます。

Linuxの場合の例
カレントディレクトリの raw ファイル全てに対して処理を実行します

コード:

$ for i in *.raw; do; ./cutimage < $i > 'out_'$i; done
ですから、freadでファイルから直接読み込むかどうかは本質的な問題ではないと思います。
ボトルネックになるのは画像処理の部分でしょうから、ファイル列挙の処理などはわざわざCで書く利点がないです。

ちなみにfopenの時にバイナリモードで開くということ以外は、
バイナリファイルとテキストファイルの扱いに大きな違いはありません。

アバター
あたっしゅ
記事: 334
登録日時: 10年前
住所: 東京23区
連絡を取る:

Re: 標準のC言語での画像の読み込み、編集方法

#3

投稿記事 by あたっしゅ » 8年前

"大漁の画像"とは、”大量の画像”のことでしたか。


>そうではなく、画像データをプログラム上で直接指定し、ファイルをオープンしたところで画像を認識。
>テキストファイルに書き込み、画像データをクローズ、テキストファイルをクローズ。
>このような処理をしたいと思っております。

FindFirstFile, FindNextFile, FindCloseFile を使います。

例:
http://nienie.com/~masapico/api_FindFirstFile.html
FindFirstFile ファイルの検索


あたっしゅ


なにごとも、やってみることが大切で、時間に余裕が出来たら、linux のコマンドラインにも挑戦してみてください。
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

アバター
kerotan0820
記事: 91
登録日時: 10年前
住所: 東京都
連絡を取る:

Re: 標準のC言語での画像の読み込み、編集方法

#4

投稿記事 by kerotan0820 » 8年前

>>h2so5様

回答有難うございます。
実行してみたところ、エラーが出てしまいました。
" token `;' のあたりにシンタックスエラー "
という内容です。
原因が分かりません…。
検索してみると、環境に依存するエラーであるような記述が有りましたが対処できずにいます。

それと、コードの内容についてお伺いしたいのですが、

コード:

$ for i in *.raw; do; ./cutimage < $i > 'out_'$i; done
for文の構成に関しては
for 変数名 in リスト名 do コマンド done
ということで、理解出来たのですが、h2so5さんが載せて下さったコードの場合、
./cutimage < $i >'out_'$i がコマンドにあたる部分ということでしょうか?
<$i>'out_'$i は 出力する画像のファイル名を out_ としその語尾に連番を付け加えるという意味でしょうか。
詳しく載っているサイトが見つかりませんでした。
けろけろにゃー (」・ω・)」うー!

アバター
kerotan0820
記事: 91
登録日時: 10年前
住所: 東京都
連絡を取る:

Re: 標準のC言語での画像の読み込み、編集方法

#5

投稿記事 by kerotan0820 » 8年前

>>あたっしゅ様
回答有難うございます
すみません、大漁は大量の誤りです。
あたっしゅ さんが書きました:FindFirstFile, FindNextFile, FindCloseFile を使います
なるほど。このような方法があるのですね。

h2so5様が教えて下さったコマンドから取り掛かっており、まだ実行できていませんが、取り急ぎ内容だけ目を通してみました。
とても便利そうな機能に見えました。
少し外出しますので、また後ほど挑戦してみます。

ありがとうございます。
けろけろにゃー (」・ω・)」うー!

non
記事: 1097
登録日時: 9年前

Re: 標準のC言語での画像の読み込み、編集方法

#6

投稿記事 by non » 8年前

静止画のファイル名は一連番号になってないの?
non

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: 標準のC言語での画像の読み込み、編集方法

#7

投稿記事 by h2so5 » 8年前

正しいのはこちらです。失礼しました

コード:

$ for i in *.raw; do ./cutimage < $i > 'out_'$i; done
変数iに入っているのは番号ではなくて、ファイル名です。
入力が abc.raw だったら out_abc.raw として出力します。

スクリプトについては、このあたりが参考になるでしょう。
http://shellscript.sunone.me/for.html
http://furyo.on-air.ne.jp/linux/bash.html

アバター
kerotan0820
記事: 91
登録日時: 10年前
住所: 東京都
連絡を取る:

Re: 標準のC言語での画像の読み込み、編集方法

#8

投稿記事 by kerotan0820 » 8年前

>>non様
今現在、シェルスクリプトの動作確認のために使っているrawファイルは連番ではありません。

>>h2so5様
ご丁寧にありがとうございます。
無事処理出来ました。

ただ、今回はルート上に raw ファイルがあったので良かったのですが、"./フォルダ1/画像ファイル.raw" を指定したい時、 " *.raw " を ./フォルダ1/*.raw " このように指定してもエラーが出てしまいました。
指定方法が間違っているのだと思いますので、添付していただいたURL先で勉強させて頂きます。
またどうしても分からなかった際は質問させていただきたいと思います。

お忙しい中ありがとうございました。
けろけろにゃー (」・ω・)」うー!

閉鎖

“C言語何でも質問掲示板” へ戻る