画像中に含まれる信号機(青・黄・赤)を抽出して出力画像に示す、といったプログラムを作成しようとしています。


認識率を高めるにはRGBの閾値を定めて抽出するだけでは不足ですよね?


微分フィルタなどの技法は知っていますがそれをどう使えばいいのかが考えてもわかりません。

どういった技法が有効なのでしょうか?是非回答よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

千差万別あると思いますね。


色情報を使う方法、エッジ形状のテンプレートマッチングを併用する方法、etc。
http://www.sic.shibaura-it.ac.jp/~yaoki/mediaeng …
http://www.ice.nuie.nagoya-u.ac.jp/thesis/2005/0 …

車両用信号灯器なら、

(○○○)

のテンプレートをエッジ画像中から探して、検出した位置で色の条件を併用してみては?

・エッジ化
http://opencv.jp/sample/gradient_edge_corner.htm …
・テンプレートマッチング
http://opencv.jp/sample/matching.html
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qパターン認識について

私は今卒論としてWeb上の静止画像の不正コピーを防止するという研究をしているのですが、自分のやっている研究とパターン認識(画像認識)との関連について話してくださいと言われ、すごい困りました... パターン認識と関係ないんじゃないか?と思うのですが、どなたか詳しい方いましたらお願いします。

Aベストアンサー

関係ないなら、「関係ありません」と言い切って、良いのでは。

たとえば、WebブラウザでみてるJPEGファイルを、スクリーンキャプチャしたものを、別途JPEGに変換したならば、99%オリジナルと変わらないでしょうが、bitパターンだけで判断すれば、おそらく「別物」となるでしょう。そういった場合にも対応できるようにするには、その画像自体の特徴をとらえて、不正コピーを見破る、とったアプローチもあるかなあ、とか。逆にそういうのじゃあダメなんです、とか。
電子すかしの実装として、画像認識技術を応用するとか。

Q座標値を読み込んである領域に含まれているかどうかを示すプログラム

プログラミングで課題が出たのですがさっぱりわからないのでどなたか教えてください!


座標値 (x, y) を読み込み,点 (x, y) が 領域1または2に属すれば(境界を含む)1を出力し,それ以外(どちらの領域にも属さない)なら0を出力するプログラムを書きなさい.

領域1
7.0 ≦ x ≦ 21.2
-1.5 ≦ y ≦ 13.8

領域2
-12.4 ≦ x ≦ 10.0
-14.0 ≦ y ≦ -7.7


おそらくかなり見当違いなことをしていると思いますが、以下です。

#include <stdio.h>

int main(void)
{
double x, y;
scanf("%f%f\n",&x,&y);

printf("%f\n", x >= 7.0 && x <= 21.2 && y>= -1.5 && y <= 13.8 || x >= -12.4 && x <= 10.0 && y >= -14.0 && y <= -7.7);
}

よろしくお願いします。

プログラミングで課題が出たのですがさっぱりわからないのでどなたか教えてください!


座標値 (x, y) を読み込み,点 (x, y) が 領域1または2に属すれば(境界を含む)1を出力し,それ以外(どちらの領域にも属さない)なら0を出力するプログラムを書きなさい.

領域1
7.0 ≦ x ≦ 21.2
-1.5 ≦ y ≦ 13.8

領域2
-12.4 ≦ x ≦ 10.0
-14.0 ≦ y ≦ -7.7


おそらくかなり見当違いなことをしていると思いますが、以下です。

#include <stdio.h>

int main(void)
{
double x, y;
scanf("...続きを読む

Aベストアンサー

結論から言えば
scanf("%lf%lf", &x, &y);
です。
double 型に対する型指定子は、 printf() は、 "%f" scanf() は、"%lf" です。
また、当然のことながら、2つの変数に対しては、2つの型指定子が必要です。

最後に scanf() の型指定子に \n を含ませると、ダミーのエンター(これが、あとひとつの入力に見えるわけです)

"%lf" だけでは、2番目の変数に入力が行われないわけです。

QアナログRGB出力ケーブル

先日PCを買いました。
付属品としてアナログRGB出力ケーブルが入ってました。
しかしそのアナログRGB出力ケーブルは使えません。おそらく不良品です。
また、最近モニタを購入しました。
それにもアナログRGB出力ケーブルが付属されていたのですが
このケーブルも使えません。

そこで、ですが
PCやモニタを購入した際に付属してくるアナログRGB出力ケーブルは使えないものなんでしょうか?
いまのところ、付属してきたケーブルは2回とも不良でした。
それとも、たまたま2回連続で不良品だったのでしょうか?

Aベストアンサー

交換テストでダメなのだとしたら、まぁダメなんだと考えていいのかな。
単純に不良品に二度当たってしまっただけかもしれません。

一応、RGBケーブルにも多少の仕様違いはあります(sync on green専用とか)
ただ、いまどきのPC用機器では、そういう仕様違いはほぼ関係ありません。
あるいは切替器を経由していると特殊な状況があるかもしれません。

私は20年かかってもRGBケーブルの不良の経験はありません。
ジャンクケーブル等でもありませんでしたし、自作ケーブルでミスった程度。

購入店に持ち込んで、確認してもらってもいいと思います。
まぁ、PC切替器とか使わない限り、余計なRGBケーブルは邪魔なだけですが。

なお、RGBの端子には出力と入力がありますが、ケーブルには"出力"と付けたりしません。
ケーブルの構造としてもアナログ用とデジタル用の区別は特に無く
デジタル出力のDVI系端子用などと区別する目的以外では省いてかまいません :-)

#各種のケーブルとの取り違えを無くすとしたら、歴史的にも
#VGA端子とかVGAケーブルって呼んじゃうのが一番シンプルです。

交換テストでダメなのだとしたら、まぁダメなんだと考えていいのかな。
単純に不良品に二度当たってしまっただけかもしれません。

一応、RGBケーブルにも多少の仕様違いはあります(sync on green専用とか)
ただ、いまどきのPC用機器では、そういう仕様違いはほぼ関係ありません。
あるいは切替器を経由していると特殊な状況があるかもしれません。

私は20年かかってもRGBケーブルの不良の経験はありません。
ジャンクケーブル等でもありませんでしたし、自作ケーブルでミスった程度。

購入店に持ち込...続きを読む

QRGB値を画像(PNG・BMPJPEGなど)に出力したい

配列に格納したRGB値からPNG画像(またはBMP画像JPEG画像)を作成したいと思っているのですが、画像ファイルの作り方がわかりません。

ファイルを作成⇒ヘッダ書きこみ⇒色情報書き込み
と、漠然とした手順しかわかりません。
詳しい方法、または参考URLがわかる方、アドバイスお願いします。

以下補足です。

・開発環境はwindowsXPのVC7でC言語を使っています。
・openCVで適切な関数があれば助かります。
(openCVのIplImageの読み込みなども参考にしようと思いましたがxmlファイルからの取得とは違うのでわかりませんでした。)

Aベストアンサー

 こんばんは。

 openCVの、

・cvCreateImage関数で24bitのIPLを作成
・RGB配列をIPLのイメージ配列に転送
・cvSaveImage関数でファイル名の拡張子にjpgやpngを付ける

 で狙い通りにセーブ出来るのではないでしょうか。以下参考程度に。

#include<cv.h>
#include<highgui.h>

#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")

typedef unsigned char Byte;

const int WIDTH = 320;
const int HEIGHT= 240;
const int IMGSIZE = 320 * 240;

int main()
{
//rgbの配列
Byte R[IMGSIZE] = {0};
Byte G[IMGSIZE] = {0};
Byte B[IMGSIZE] = {0};

//緑色に塗り潰す
::memset(G, 0xff, IMGSIZE);

//24bitのiplを作成
IplImage* ipl = ::cvCreateImage(cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 3);

//iplのイメージ配列にrgbの配列を転送
for(int y = 0; y < ipl->height; ++y)
{
for(int x = 0; x < ipl->width; ++x)
{
const int dpos = (x * ipl->nChannels) + (ipl->widthStep * y);
const int spos = x + (WIDTH * y);
ipl->imageData[dpos] = B[spos];
ipl->imageData[dpos+1] = G[spos+1];
ipl->imageData[dpos+2] = R[spos+2];
}
}

//jpgでセーブ
::cvSaveImage("test.jpg", ipl);

//pngでセーブ
::cvSaveImage("test.png", ipl);

//iplの破棄
::cvReleaseImage(&ipl);

return 0;
}

 こんばんは。

 openCVの、

・cvCreateImage関数で24bitのIPLを作成
・RGB配列をIPLのイメージ配列に転送
・cvSaveImage関数でファイル名の拡張子にjpgやpngを付ける

 で狙い通りにセーブ出来るのではないでしょうか。以下参考程度に。

#include<cv.h>
#include<highgui.h>

#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")

typedef unsigned char Byte;

const int WIDTH = 320;
const int HEIGHT= 240;
const int IMGSIZ...続きを読む

QPS2用の「粗悪なRGB21pinケーブル」はS端子!?

恐れ入りますが、何方様かご意見を聞かせてください。

PS2は、初期のSCPH-10000とSCPH-15000以外、RGB出力でDVDを観る時は「緑がかった映像」になるために接続が出来ないと良く聞きます。
つまり、型番がSCPH-18000以降のPS2は「RGB出力ができない」との事ですが、そこで幾つかご質問があります。

・型番SCPH-18000以降のPS2でRGB出力できないのは、【映画などのDVDを鑑賞する時だけ】でしょうか?
・それとも【DVD-ROMのゲームを遊ぶ時】にも、RGB出力は出来ないのでしょうか?
きちんと初期の設定で「システム設定」の「コンポーネント映像出力」を 初期設定の「Y Cb/Pb Cr/Pr」から「RGB」に切り替えてあります。

手持ちのRGBケーブルでゲームは映るのですが、映し出される映像を【S端子と比べても】まったく差がありません。
使用しているRGBケーブルは、ソニー純正ではなく第三メーカーが製作したRGBケーブルです。
S端子で繋いだゲームの画像と、第三メーカーRGBケーブルで繋いだ時の画像の差が全くないので、21ピンのコネクターを使ってS端子でTVに入力されているのか疑っております。

・「S端子」と「RGB21ピン」は映像の差はあまりないのでしょうか?
・また、仮に画質を比べる時はどういう場面で比べるべきなのでしょうか?
私はRGBの方が輪郭がしっかりしていそうなので、TVに映し出される小さな漢字の「はね」や「はらい」、全体の輪郭を比較しております。

(1)SCPH-18000以降でRGB結線できないのは、『DVD映画の鑑賞時』だけなのでしょうか?
(2)SCPH-18000以降のPS2で『ゲームをする時だけ』は、RGB結線ができているのでしょうか?
(3)映像が入っているDVD-ROMゲームも、映画としての観賞用DVDではないので『RGB結線できている』のでしょうか?
(4)『S端子とRGB端子での映像の違い』は、どのような場面で明確に判断できるのでしょうか?

宜しければ何方様かご教授下さい。

恐れ入りますが、何方様かご意見を聞かせてください。

PS2は、初期のSCPH-10000とSCPH-15000以外、RGB出力でDVDを観る時は「緑がかった映像」になるために接続が出来ないと良く聞きます。
つまり、型番がSCPH-18000以降のPS2は「RGB出力ができない」との事ですが、そこで幾つかご質問があります。

・型番SCPH-18000以降のPS2でRGB出力できないのは、【映画などのDVDを鑑賞する時だけ】でしょうか?
・それとも【DVD-ROMのゲームを遊ぶ時】にも、RGB出力は出来ないのでしょうか?
きちんと初期の設定で「...続きを読む

Aベストアンサー

>・型番SCPH-18000以降のPS2でRGB出力できないのは、【映画などのDVDを鑑賞する時だけ】でしょうか?

そうです。
ただ、気をつけなければならないのは、その自動的に切り替わることをちゃんとTV側が認識できる必要があります。
RGB21ピン端子を備えたテレビでもY Cb/Pb Cr/Prを認識できずに緑だけを表示するテレビがあります。
(緑色だけ線が一緒のため)
PS2が出る以前のPS対応テレビの大半はこれになります。

>・「S端子」と「RGB21ピン」は映像の差はあまりないのでしょうか?

RGB21ピンの端子のどこかがS端子信号そのままが流れているようです。
そのケーブルはRGB21ピンのS端子信号部分だけを取り出しているのかもしれません。

(1)Yes
(2)そのような設定にすることは可能です
(3)DVD-ROMゲームとして起動した限り、常にRGB出力になります。(RGBに設定してあれば)
(4)色の境界がはっきりわかる様なアニメ等がわかりやすいと思います。

Qサイコロをふって、出た目のパターンをカウントしていくプログラムがかけません。

 Visual C++ 2005でプログラムをしている初心者です。おそらく基本的な間違いをしていると思います。
 
 次の様にプログラムしたところ、

/*賽を四回振ると?*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int b[4], i, j;
double o[4], x, c[4];

printf("試行回数を入れてください。\n");
scanf_s("%d",&x);

for(i=0; i<4; i++){
c[i]=0;
}

for(i=0; i<x; i++){
for(j=0; j<4; j++){
srand(time(NULL));
b[j]=rand()%6+1;
}
if(b[0]==b[1]==b[2]==b[3]==1){
c[0]=c[0]+1;
}
else if(b[0]==1||b[1]==1||b[2]==1||b[3]==1){
c[1]=c[1]+1;
}
else if( b[0]!=b[1] && b[0]!=b[2] && b[0]!=b[3] && b[1]!=b[2] && b[1]!=b[3] && b[2]!=b[3] ){
c[2]=c[2]+1;
}
else{
c[3]=c[3]+1;
}
}
for(i=0; i<4; i++){
o[i]=x/c[i];
}

printf("四つの賽を%d回、投げたところ・・・・・・\n",x);


printf("四つとも1の場合は%d回となり、倍率は%lfとなりました。\n",c[0],o[0]);
printf("1がある場合は%d回となり、倍率は%lfとなりました。\n",c[1],o[1]);
printf("1以外のぞろ目がある場合は%d回となり、倍率は%lfとなりました。\n",c[3],o[3]);
printf("ブタの場合は%d回となり、倍率は%lfとなりました。\n",c[2],o[2]);
}

何度やっても次の様な結果になります(1296は入力値です)

試行回数を入れてください。
1296
四つの賽を1296回、投げたところ・・・・・・
四つとも1の場合は0回となり、倍率は0.000000となりました。
1がある場合は0回となり、倍率は0.000000となりました。
1以外のぞろ目がある場合は0回となり、倍率は0.000000となりました。
ブタの場合は0回となり、倍率は0.000000となりました。
続行するには何かキーを押してください . . .

予定としては

試行回数を入れてください。
1296
四つの賽を1296回、投げたところ・・・・・・
四つとも1の場合は1回となり、倍率は1296となりました。
1がある場合は670回となり、倍率は1.94となりました。
1以外のぞろ目がある場合は505回となり、倍率は2.57となりました。
ブタの場合は120回となり、倍率は10.8となりました。
続行するには何かキーを押してください . . .

位の結果が出ると思うのですが(計算が間違ってなければ)。

 Visual C++ 2005でプログラムをしている初心者です。おそらく基本的な間違いをしていると思います。
 
 次の様にプログラムしたところ、

/*賽を四回振ると?*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int b[4], i, j;
double o[4], x, c[4];

printf("試行回数を入れてください。\n");
scanf_s("%d",&x);

for(i=0; i<4; i++){
c[i]=0;
}

for(i=0; i<x; i++){
for(j=0; j<4; j++){
srand(time(NULL));
b[j]=rand()%6+1;
}
if(b[...続きを読む

Aベストアンサー

まず、scanf_s, printfの書式が間違っています。
%dとあるところは全て%lfに直してください。

> for(i=0; i<x; i++){
> for(j=0; j<4; j++){
> srand(time(NULL));
> b[j]=rand()%6+1;

srandは最初の一回だけ実行すればいいです。
そのプログラムを実行すると、あっという間に結果が表示されると思いますが、早すぎてtimeの値が変化しない、つまりいつも同じ値の乱数しか発生しません。

上の二つを直しても、if文の条件が間違っているので思った結果は出ません。
どこが間違っているか考えてみてください。

QRGBとVGAの違い

RGBとVGAの違いを教えて下さい。
よろしくお願いいたします。

Aベストアンサー

VGAは
http://ja.wikipedia.org/wiki/Video_Graphics_Array
基本的に表示回路の規格です。画素数を表す場合に良く用いられます。
VGA,SVGA,XGA,SXGA,UXGAなどなど

RGBはRed,Green,,Blueの頭文字で光の3原色で色を表すための言葉です。主として,ディスプレイで用いられる言葉です。接続端子の呼び方として,アナログRGBなどと言ったりします。
印刷などではCMYK(シアン,マゼンダ,イエロー,キー(黒))で色を表現します。
http://ja.wikipedia.org/wiki/%E8%89%B2%E7%A9%BA%E9%96%93

QIPアドレスを抽出して出力するプログラム

下記のプログラムはIPアドレスを表示するプログラムです。for文を見てくれたら分かると思いますが、iが0~5まで繰り返し処理されるので、アドレスが5つ表示される結果になります。
このアドレスの先頭の数字(例えば「196.x.x.x」だと196)だけを見て先頭が196から始まるアドレスは表示して、先頭が196以外のアドレスは表示しないようにするにはどう書き加えればうまく実行できますか?
OSはWinXPでコンパイラVC++です。
#include <stdio.h>
#include <winsock2.h>
#include <iphlpapi.h>
int
main()
{
DWORD i;
PMIB_UDPTABLE pUdpTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
char *addr_ptr;
if (GetUdpTable(NULL, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
pUdpTable = (MIB_UDPTABLE *) malloc (dwSize);
}
if ((dwRetVal = GetUdpTable(pUdpTable, &dwSize, 0))
== NO_ERROR) {
if (pUdpTable->dwNumEntries > 0) {
for (i=0; i<5; i++) {
addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr;
printf("Your Address: %s\n",
inet_ntoa(*(struct in_addr *)addr_ptr));
}
}
}
else {
printf("GetUdpTable failed.\n");
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwRetVal,
MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT), //Default language
(LPTSTR) &lpMsgBuf,
0,
NULL )) {
printf("\tError: %s", lpMsgBuf);
}

LocalFree( lpMsgBuf );
}

return 0;
}

下記のプログラムはIPアドレスを表示するプログラムです。for文を見てくれたら分かると思いますが、iが0~5まで繰り返し処理されるので、アドレスが5つ表示される結果になります。
このアドレスの先頭の数字(例えば「196.x.x.x」だと196)だけを見て先頭が196から始まるアドレスは表示して、先頭が196以外のアドレスは表示しないようにするにはどう書き加えればうまく実行できますか?
OSはWinXPでコンパイラVC++です。
#include <stdio.h>
#include <winsock2.h>
#include <iphlpapi.h>
int
main()
{...続きを読む

Aベストアンサー

 以下のようしては如何でしょう。

for (i=0; i<5; i++) {
char buf[256];
addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr;
sprintf(buf, "%s",
inet_ntoa(*(struct in_addr *)addr_ptr));
if(strncmp(buf, "196", 3) == 0)
printf("Your Address: %s\n", buf);
}

Qパターン認識について

画像中に含まれる信号機(青・黄・赤)を抽出して出力画像に示す、といったプログラムを作成しようとしています。


認識率を高めるにはRGBの閾値を定めて抽出するだけでは不足ですよね?


微分フィルタなどの技法は知っていますがそれをどう使えばいいのかが考えてもわかりません。

どういった技法が有効なのでしょうか?是非回答よろしくお願いします。

Aベストアンサー

千差万別あると思いますね。
色情報を使う方法、エッジ形状のテンプレートマッチングを併用する方法、etc。
http://www.sic.shibaura-it.ac.jp/~yaoki/mediaeng/ITS04.pdf
http://www.ice.nuie.nagoya-u.ac.jp/thesis/2005/080230598.pdf

車両用信号灯器なら、

(○○○)

のテンプレートをエッジ画像中から探して、検出した位置で色の条件を併用してみては?

・エッジ化
http://opencv.jp/sample/gradient_edge_corner.html#edge
・テンプレートマッチング
http://opencv.jp/sample/matching.html

Q閏年が何個含まれるか求めるプログラム

3桁、あるいは4桁の整数を10個程度入力して、これらの中
に閏年が何個含まれるか求めるプログラムの書き方を教え
てください。
 お願いします。

Aベストアンサー

まず「入力する整数は何なのか」と「閏年ってどんな日なのか」ってのを、きちんと提示しましょう。

例えば、エチオピアでは、閏年は「4で割り切れる年の前の年の、13月6日」が閏年です。因みに、エチオピアは、今は「2001年5月」です。

入力する数値が、西暦年なのか、エチオピア年なのか、皇紀年なのか、そこんところをハッキリさせましょう。

そして閏年も、それがどういうモノなのかハッキリさせましょう。

それらがハッキリしないと、プログラムは作れません。

1.整数を1つ入力するだけのプログラムを作る。
#include <stdio.h>
int main(void)
{
int year;
scanf("%d",&year);
return 0;
}

2.上記1のプログラムを改造して、整数を入力し、入力した整数が0だったら終了、0じゃなかったら入力を繰り返すようにする。
3.上記2のプログラムを改造して、0が入力されたら今までに入力した整数の「個数」を表示して終了、0じゃないなら入力した「個数」をカウントアップして入力を繰り返すようにする。
4.上記3のプログラムを改造して、入力した整数が0でなく、かつ、3桁か4桁の整数じゃなかった時は、カウントアップせずに入力をやり直すようにする。
5.上記4のプログラムを改造して、入力した個数をカウントする部分を、入力した整数が閏年の時だけカウントするようにする。

何も無い所から一気に「最終目的のプログラム」を書くのは無理なので、上記のように「少しづつ積み上げていく」と良いでしょう。

まず「入力する整数は何なのか」と「閏年ってどんな日なのか」ってのを、きちんと提示しましょう。

例えば、エチオピアでは、閏年は「4で割り切れる年の前の年の、13月6日」が閏年です。因みに、エチオピアは、今は「2001年5月」です。

入力する数値が、西暦年なのか、エチオピア年なのか、皇紀年なのか、そこんところをハッキリさせましょう。

そして閏年も、それがどういうモノなのかハッキリさせましょう。

それらがハッキリしないと、プログラムは作れません。

1.整数を1つ入力す...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報