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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

7678閲覧

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

fdaskjlfda

総合スコア40

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2018/01/30 10:57

編集2018/02/02 01:57

環境

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 だとはっきりわかるもの。

よろしくお願いします。

追記

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

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

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

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

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

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

LouiS0616

2018/01/30 11:03

『特定の色』とは何でしょうか?前もってRGB値を指定するのですか?
yumetodo

2018/01/30 12:04

その色の場所というのがもう少し詳しく知りたいです。例えば見つかった色の図形の外接四角形とか外接円なのか、見つかった図形の境界全座標なのか、はたまた見つかった色の座標全列挙なのか・・・
yumetodo

2018/01/30 12:06

「微妙に色が違う」・・・う~ん、人間の目は明るさ方向に敏感で色差にはさほど敏感ではないので、BT.709にそってYCbCr変換してY,Cb,Crそれぞれに許容範囲を指定してあげるとかですかねぇ
fdaskjlfda

2018/01/30 12:06

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

2018/01/30 12:07

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

2018/01/30 12:10 編集

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

回答2

0

ベストアンサー

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

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

C++

1#include <atlimage.h> 2// ↑CImageクラスを使うためのヘッダーファイルをあらかじめインクルードしておくこと 3 4 5// 画像ファイルのロード 6CImage image; 7HRESULT hr = image.Load(画像ファイルのパス); 8if(FAILED(hr)) 9{ 10 // エラー 11} 12 13// 指定座標からの色の抽出 14COLORREF color = image.GetPixel(x座標, y座標); 15BYTE r = GetRValue(color); 16BYTE g = GetGValue(color); 17BYTE b = GetBValue(color); 18 19// 色の距離を計算 20int r_diff = (int)r1 - r2; 21int g_diff = (int)g1 - g2; 22int b_diff = (int)b1 - b2; 23int diff2 = r_diff * r_diff + g_diff * g_diff + b_diff * b_diff; 24double diff = sqrt(diff2); // ※距離の大小比較だけならsqrt不要

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

投稿2018/02/01 15:57

catsforepaw

総合スコア5938

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

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

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 13:22

Chironian

総合スコア23272

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

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

yumetodo

2018/01/30 13:56

HSVよりかはBT.709などで規定されるYCbCrのほうが合致すると思われます >スクリーンショット画像はWindowsでは普通ビットマップ画像ですよ。 多分Snipping Toolのことを言っているんじゃないかな
Chironian

2018/01/30 14:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問