• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++の関数等を使った書き方)

C++OpenCVでHSV変換をみやすくまとめる方法

このQ&Aのポイント
  • C++OpenCVでHSV変換を行うプログラムを、関数を使ってみやすくまとめたいです。具体的な書き方や返り値について教えてください。
  • プログラムの内容は、HSV変換を行っています。main文の外に変換処理を記述したい場合、どのような書き方をすれば良いでしょうか。また、返り値はHSVの3つの値が欲しいです。
  • 初歩的な質問で申し訳ありません。関数以外でもプログラムを見やすくする方法があれば、教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; }

mitti0157
質問者

お礼

迅速かつ、わかりやすい説明ありがとうございます。 大変勉強になります! これをもとにプログラムを組んでみようと思います。 ありがとうございました。

関連するQ&A