- ベストアンサー
C++OpenCVでHSV変換をみやすくまとめる方法
- C++OpenCVでHSV変換を行うプログラムを、関数を使ってみやすくまとめたいです。具体的な書き方や返り値について教えてください。
- プログラムの内容は、HSV変換を行っています。main文の外に変換処理を記述したい場合、どのような書き方をすれば良いでしょうか。また、返り値はHSVの3つの値が欲しいです。
- 初歩的な質問で申し訳ありません。関数以外でもプログラムを見やすくする方法があれば、教えていただけると助かります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じですかね。 あと、この場合のように、使う必要のないところで配列を使うのは、たとえば、 HSV[y][x].V = p[0]; //R else{min = p[2];} //Rがmin で、どっちが red ? というように混乱のもとかと思います。 一応そのあたり振り直したつもりですが、間違っているかもしれません。 あと、処理自体がどうも不自然な感じがしますが、そのまま書き直しました(と思います) また、ここでは使ってないですが、本当に、HSV[y][x].H = 0; のような添え字付きで同じものを書く必要があるときは、 struct _HSV *ptr = &HSV[y][x]; とするだけで、 ptr->H のように(あと、ptr->V, ptr->S も同じ)アクセスできるので見かけは変わりますね。 struct colorSetType { int red; int green; int blue; }; struct _HSV { int H; int S; int V; }; int minColor(struct colorSetType color) { int result = color.red; if (reuslt > color.green) result = color.green; if (result > color.blue ) result = color.blue; return result; } int maxColor(struct colorSetType color) { int result = color.red; if (reuslt < color.green) result = color.green; if (result < color.blue ) result = color.blue; return result; } strcut _HSV getHSV(struct colorSetType color) { struct _HSV resut; int max = maxColor(color); int min = minColor(color); int diff = max - min; if (min == max) { result.H = 0; result.S = 0; result.V = color.blue; } else if (color.red == max) { result.H = 60 * (color.green - color.blue) / diff; } else if (color.green == max) { result.H = 60 * (color.blue - color.red) / diff; result.V += 120; } else { result.H = 60 * (color.red - color.green) / diff; result.V += 240; } if (result.H < 0) result.H += 360; return result; } int main() { struct _HSV HSV[2000][2000]; struct colorSetType p; int x; int y; src_img = cvLoadImage (filename, CV_LOAD_IMAGE_COLOR); for(y = 0; y < src_img->height; y++) { for(x = 0; x < src_img->width; x++) { p.blue = src_img->imageData[src_img->widthStep * y + x * 3]; // B p.green = src_img->imageData[src_img->widthStep * y + x * 3 + 1]; // G p.red = src_img->imageData[src_img->widthStep * y + x * 3 + 2]; // R HSV[y][x] = getHSV(p); if(x % 60== 0) { fprintf(fp, "%d ,%d\n", HSV[y][x].H, HSV[y][x].S); } } } return 0; }
お礼
迅速かつ、わかりやすい説明ありがとうございます。 大変勉強になります! これをもとにプログラムを組んでみようと思います。 ありがとうございました。