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

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

ただいまの
回答率

88.21%

C言語で、写真から特定の色を判定する方法など

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,275

fdaskjlfda

score 35

 環境

PC: Windows10
言語: C言語
コンパイラー: Visual Studio (or MinGW)

C言語のサイト(苦C, programming place plusなど)はすべてマスターしました。
といっても、本orサイト片手にできるほどですが...

 目的

このような写真の(任意の)色の場所の座標をソフトを使って計算する。

 作りたいソフト

わかりやすいように箇条書きで書きます。
1, スクリーンショット(ctrl + PrtScr)をとる
2, ソフトにその画像の絶対パスを入力(コピペ)する
3, ソフトが(複数の)特定の色を判定する
4, ソフトがその色の場所(*1)を調べる
5, txtなどの任意のファイルにその結果を出力する

(*1): 場所は、画面上でのどこにあるのかが正確にわかるものでしたらどのような形でも大丈夫です。

 質問したいこと

1,2,5はすでに自分でできます。
3,4をする方法を知りたいです。
直接的にソースコードを教えてもらえるのもうれしいですし、参考サイトのURLを貼り付けても喜びます(英語は読めないことはないですが、できれば遠慮したいです)。
また、その作業?の名前があるのなら、自分でも調べてみたいのでその名前も教えてもらえると助かります。
(ex. パソコンの画面の写真を撮る = スクリーンショットをとる, atomでC言語を使えるようにする = atomでC言語の開発環境を整える 等)

 補足情報

通常、スクリーンショットの画像のデータはpngですが、jpgやjpegなどでもできるような方法が知りたいです。
また、ソフトですが、自分で使用するだけなのでCUIで大丈夫です(というより、GUIは今の段階では技術的に無理です)
特定の色の指定方法は、下の条件に当てはまるものなら問題ないです。
1, 画像から何らかの方法でその色の値を抽出できること
2, 同じ色でも微妙に色が違う場合があるので、色の違いが連続的にわかるもの。
例えば、赤とオレンジの違い = a; 赤と黒の違い = b;としたときに、a < b だとはっきりわかるもの。

よろしくお願いします。

 追記

申し訳ありません、試してからベストアンサーを選びたいという身勝手な思いがあるので、まだ回答募集中になっています。
また、今リアルが忙しいので、あと数日はできません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fdaskjlfda

    2018/01/30 21:06

    座標は、(x,y)で、境界全座標がわかるものがいいです。

    キャンセル

  • yumetodo

    2018/01/30 21:07

    いずれにしてもGUIなしなのにどうやって色を指定するのかなと言うのが不明瞭ですね

    キャンセル

  • fdaskjlfda

    2018/01/30 21:10 編集

    RGBで指定する場合、scanfで入力するか、そもそもプログラムに書き込むかの二通りを考えています

    キャンセル

回答 2

checkベストアンサー

0

単に色の近さ(赤に対してオレンジと黒のどっちが近い色かというようなこと)を調べたいだけなら、RGBでもできますね。RGBを3次元座標と捉えて、二つの色の距離を計算するだけです。

C++になってしまいますが、単純な画像データの処理ならATL(Windows SDK)のCImageクラスを使えば簡単にできます。
使い方自体は簡単ですし前提条件は何もないので、Cスタイルのプログラムからでも問題なく使えます。

#include <atlimage.h>
// ↑CImageクラスを使うためのヘッダーファイルをあらかじめインクルードしておくこと


// 画像ファイルのロード
CImage image;
HRESULT hr = image.Load(画像ファイルのパス);
if(FAILED(hr))
{
    // エラー
}

// 指定座標からの色の抽出
COLORREF color = image.GetPixel(x座標, y座標);
BYTE r = GetRValue(color);
BYTE g = GetGValue(color);
BYTE b = GetBValue(color);

// 色の距離を計算
int r_diff = (int)r1 - r2;
int g_diff = (int)g1 - g2;
int b_diff = (int)b1 - b2;
int diff2 = r_diff * r_diff + g_diff * g_diff + b_diff * b_diff;
double diff = sqrt(diff2);    // ※距離の大小比較だけならsqrt不要


ちなみに、CImageが読み込める画像形式はBMP,PNG,GIF,JPEG,TIFFです。詳しくは当該リファレンスを参照してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

1, 画像から何らかの方法でその色の値を抽出できること

画像をビットマップ形式で取り扱うのであれば、RGB値で指定して、それと一致するものだけ抽出すればよいと思います。

2, 同じ色でも微妙に色が違う場合があるので、色の違いが連続的にわかるもの。
例えば、赤とオレンジの違い = a; 赤と黒の違い = b;としたときに、a < b だとはっきりわかるもの。

人の目に見える色はRGBの三原色ですから、3次元ベクトル値です。3次元ベクトル値を1列に並べるのはちょっと難しいと思います。色空間を1次元へ写像する何らかの関数が必要ですが、一般的なものはありません。

色味を判定するのであれば、HSV色空間へ変換して、主にHで判定すれば、結構視覚と一致しますよ。その際、はSとVが小さすぎると色味がないのである程度S, Vが大きいことも判定する必要があります。
因みに、HSV色空間では黒は色ではありません。彩度(S)が0、明度(V)が0です。白は彩度(S)が0、明度(V)が最大値です。

通常、スクリーンショットの画像のデータはpngですが、jpgやjpegなどでもできるような方法が知りたいです。

スクリーンショット画像はWindowsでは普通ビットマップ画像ですよ。非圧縮です。
ペイントなどに貼り付けて保存する際にPNG形式で保存すればPNGになります。

それらの圧縮形式の画像を読むならOpenCVを使うのがお手軽と思います。
これなら画像をHSVへ変換するのも簡単です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/30 22:56

    HSVよりかはBT.709などで規定されるYCbCrのほうが合致すると思われます

    >スクリーンショット画像はWindowsでは普通ビットマップ画像ですよ。

    多分Snipping Toolのことを言っているんじゃないかな

    キャンセル

  • 2018/01/30 23:04

    HSVは色味だけなら一次元で判定できるので便利ですよ。輝度や彩度まで同時に判定が必要ならば大差ないですけどね。
    ところで、Snipping Toolなんてあるのですね!! 知りませんでした。ありがとうです。

    キャンセル

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

  • ただいまの回答率 88.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る