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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C

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

Q&A

解決済

1回答

850閲覧

C言語 ソースコードのエラー原因がわからない

snowman_F

総合スコア19

C

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

0グッド

0クリップ

投稿2021/07/26 08:16

C言語初心者です。
「5×5のBayerパターンでの色表現で適応型カラーブレーン補間法(ACPI)を使用する」という課題ですが詰まりました。
Qtで実行すると27個もエラーが出てくる状況です。

かなりあると思いますが、1つでもおかしなところ見つけたら教えてください。
よろしくお願いします。

#include "acpi.h" #include <math.h> #include <stdlib.h> static void acpi1(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b); static void acpi2(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b); static void acpi3(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b); static void acpi4(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b); void MakeRGBData_Acpi( unsigned char* const out_r, /* R */ unsigned char* const out_g, /* G */ unsigned char* const out_b, /* B */ unsigned char const* const input_img, /* aのアドレステーブル */ int const start_x, /* 切り出し位置 x */ int const start_y, /* 切り出し位置 y */ int const size_x, /* 切り出しサイズ x */ int const size_y /* 切り出しサイズ y */ ) { int y; int const end_x = start_x + size_x; int const end_y = start_y + size_y; for (y = start_y; y < end_y; ++y) { int x; for (x = start_x; x < end_x; ++x) { int const in_pos = y * BUF_WIDTH + x; int const out_pos = (x - start_x) + (y - start_y) * size_x; unsigned char const* const bayerA = &input_img[in_pos]; unsigned int A_RED, A_GREEN, A_BLUE; unsigned int is_odd_x = x & 1; unsigned int is_odd_y = y & 1; // 今回の入力画像のベイヤパターンは以下の通り // o → x // ↓ G B G B G B ・・・0行目(奇数行) // y R G R G R G ・・・1行目(偶数行) // G B G B G B ・・・2行目(奇数行) // R G R G R G ・・・3行目(偶数行) // G B G B G B ・・・4行目(奇数行) // R G R G R G ・・・5行目(偶数行) if(is_odd_x && is_odd_y) { // 処理対象画素が偶数行、偶数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のGが今回処理対象画素。周囲の5×5の画素の値を使って中央のR,Bを復元 // G R G R G // B G B G B // G R G R G // B G B G B // G R G R G acpi1(bayerA, &A_RED, &A_GREEN, &A_BLUE); } else if(is_odd_x && !is_odd_y) { // 処理対象画素が奇数行、偶数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のBが今回処理対象画素。周囲の5×5の画素の値を使って中央のR,Gを復元 // B G B G B // G R G R G // B G B G B // G R G R G // B G B G B acpi2(bayerA, &A_RED, &A_GREEN, &A_BLUE); } else if(!is_odd_x && is_odd_y) { // 処理対象画素が偶数行、奇数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のRが今回処理対象画素。周囲の5×5の画素の値を使って中央のG,Bを復元 // R G R G R // G B G B G // R G R G R // G B G B G // R G R G R acpi3(bayerA, &A_RED, &A_GREEN, &A_BLUE); } else { // 処理対象画素が奇数行、奇数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のGが今回処理対象画素。周囲の5×5の画素の値を使って中央のR,Bを復元 // G B G B G // R G R G R // G B G B G // R G R G R // G B G B G acpi4(bayerA, &A_RED, &A_GREEN, &A_BLUE); } out_r[out_pos] = A_RED ; out_g[out_pos] = A_GREEN ; out_b[out_pos] = A_BLUE ; } } } //------------------------------------------- // acpi1は以下のベイヤパターンの33位置のrgbの画素値を算出する処理 // G11 R12 G13 R14 G15 // B21 G22 B23 G24 B25 // G31 R32 G33 R34 G35 // B41 G42 B43 G44 B45 // G51 R52 G53 R54 G55 //------------------------------------------- static void acpi1(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b) { // 周囲5×5の画素値を代入する unsigned char const r32 = *(bayer - 1); unsigned char const r34 = *(bayer + 1); unsigned char const g13 = *(bayer - 2 * BUF_WIDTH ); unsigned char const g22 = *(bayer - BUF_WIDTH - 1); unsigned char const g24 = *(bayer - BUF_WIDTH + 1); unsigned char const g33 = *bayer; unsigned char const g35 = *(bayer - BUF_WIDTH + 2); unsigned char const b23 = *(bayer - BUF_WIDTH); unsigned char const b43 = *(bayer + BUF_WIDTH); //追加で必要な数値を算出 unsigned char const g23 = ((g13 + g22 + g24 + g33)/4); unsigned char const g32 = ((g13 + g22 + g24 + g33)/4); unsigned char const g34 = ((g13 + g22 + g24 + g33)/4); unsigned char const g43 = ((g13 + g22 + g24 + g33)/4); // 処理対象画素(5×5画素の中央)のRGB値を算出 // rの値を算出 *r = (r32 + r34)/2 + (-g23 + 2 * g33 - g43)/4; // gの値を算出 *g = g33; // bの値を算出 *b = (b23 + b43)/2 + (-g32 + 2 * g33 - g34)/4; //---------------------------------------------- // acpi2は以下のベイヤパターンの33位置のrgbの画素値を算出する処理 // B11 G12 B13 G14 B15 // G21 R22 G23 R24 G25 // B31 G32 B33 G34 B35 // G41 R42 G43 R44 G45 // B51 G52 B53 G54 B55 //---------------------------------------------- static void acpi2(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b) { // 周囲5×5の画素値を代入する unsigned char const r22 = *(bayer - BUF_WIDTH - 1); unsigned char const r24 = *(bayer - BUF_WIDTH + 1) unsigned char const r42 = *(bayer + BUF_WIDTH - 1); unsigned char const r44 = *(bayer + BUF_WIDTH + 1); unsigned char const g23 = *(bayer - BUF_WIDTH); unsigned char const g25 = *(bayer - BUF_WIDTH + 2); unsigned char const g32 = *(bayer - 1); unsigned char const g34 = *(bayer + 1); unsigned char const g41 = *(bayer + BUF_WIDTH - 2); unsigned char const g43 = *(bayer + BUF_WIDTH); unsigned char const g45 = *(bayer + BUF_WIDTH + 2); unsigned char const b13 = *(bayer - 2 * BUF_WIDTH ); unsigned char const b31 = *(bayer + BUF_WIDTH - 2); unsigned char const b33 = *bayer; unsigned char const b35 = *(bayer - BUF_WIDTH + 2); unsigned char const b53 = *(bayer - 2 * BUF_WIDTH ); // cとdの値を算出 unsigned int const c = ((-g24 + 2 * g33 - g42) + (r24 - r42)); unsigned int const d = ((-g22 + 2 * g33 - g44) + (r22 - r44)); // cとdの絶対値を算出 c = abs(c); d = abs(d); // 処理対象画素(5×5画素の中央)のRGB値を算出 // rの値を算出 if (c < d) { *r = ((r24 + r42))/2 + ((-g24 + 2 * g33 - g42))/4; } else if (c > d) { *r = ((r22 + r44))/2 + ((-g22 + 2 * g33 - g44))/4; } else (c = d) { *r = ((r24 + r42 + r22 + r44)/4) + ((-g22 - g24 + 4 * g33 - g42 - g44)/8); } // eとfの値を算出 unsigned int const e = ((-b13 + 2 * b33 - b53) + (g23 - g43)); unsigned int const f = ((-b31 + 2 * b33 - b35) + (g32 - g34)); // eとfの絶対値を算出 e = abs(e); f = abs(f); // gの値を算出 if (e < f) { *g = ((g23 + g43))/2 + ((-r13 + 2 * r33 - r53))/4; } else if (e > f) { *g = ((g32 + g34))/2 + ((-r31 + 2 * r33 - r35))/4; } else (e = f) { *g = ((g23 + g43 + g32 + g34)/4) + ((-r13 - r31 + 4 * r33 - r35 - r53)/8); } // bの値を算出 *b = B33 } //---------------------------------------------- // acpi3は以下のベイヤパターンの33位置のrgbの画素値を算出する処理 // R11 G12 R13 G14 R15 // G21 B22 G23 B24 G25 // R31 G32 R33 G34 R35 // G41 B42 G43 B44 G45 // R51 G52 R53 G54 R55 //---------------------------------------------- static void acpi3(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b) { // 周囲5×5の画素値を代入する unsigned char const r13 = *(bayer - 2 * BUF_WIDTH ); unsigned char const r31 = *(bayer + BUF_WIDTH - 2); unsigned char const r33 = *bayer; unsigned char const r35 = *(bayer - BUF_WIDTH + 2); unsigned char const r53 = *(bayer - 2 * BUF_WIDTH ); unsigned char const g23 = *(bayer - BUF_WIDTH); unsigned char const g32 = *(bayer - 1); unsigned char const g34 = *(bayer + 1); unsigned char const g43 = *(bayer + BUF_WIDTH); unsigned char const b22 = *(bayer - BUF_WIDTH - 1); unsigned char const b24 = *(bayer - BUF_WIDTH + 1) unsigned char const b42 = *(bayer + BUF_WIDTH - 1); unsigned char const b44 = *(bayer + BUF_WIDTH + 1); // 処理対象画素(5×5画素の中央)のRGB値を算出 // hとiの値を算出 unsigned int const h = ((-r13 + 2 * r33 - r53) + (g23 - g43)); unsigned int const i = ((-r31 + 2 * r33 - r35) + (g32 - g34)); // hとiの絶対値を算出 h = abs(h); i = abs(i); // gの値を算出 if (h < i) { *g = ((g23 + g43))/2 + ((-r13 + 2 * r33 - r53))/4; } else if (h > i) { *g = ((g32 + g34))/2 + ((-r31 + 2 * r33 - r35))/4; } else (h = i) { *g = ((g23 + g43 + g32 + g34)/4) + ((-r13 - r31 + 4 * r33 - r35 - r53)/8); } // jとkの値を算出 unsigned int const j = ((-g24 + 2 * g33 - g42) + (b24 - b42)); unsigned int const k = ((-g22 + 2 * g33 - g44) + (b22 - b44)); // jとkの絶対値を算出 j = abs(j); k = abs(k); // bの値を算出 if (j < k) { *b = ((b24 + b42))/2 + ((-g24 + 2 * g33 - g42))/4; } else if (j > k) { *b = ((b22 + b44))/2 + ((-g22 + 2 * g33 - g44))/4; } else (j = k) { *b = ((b24 + b42 + b22 + b44)/4) + ((-g22 - g24 + 4 * g33 - g42 - g44)/8); } // rの値を算出 *r = r33 }

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

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

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

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

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

itagagaki

2021/07/26 08:18

エラーは大量に出ても1つずつ間違いを正していくしかありません。 1つの修正で複数のエラーが解消することもあります。 とにかくエラーメッセージをちゃんと読まないことには進みません。 エラーメッセージを提示しないでこのコードのどこがおかしいか指摘してくれと言うのは無茶です。
guest

回答1

0

ベストアンサー

C

1// 周囲5×5の画素値を代入する 2unsigned char const r22 = *(bayer - BUF_WIDTH - 1); 3unsigned char const r24 = *(bayer - BUF_WIDTH + 1) // ; 抜け 4unsigned char const r42 = *(bayer + BUF_WIDTH - 1);

投稿2021/07/26 08:19

ozwk

総合スコア13532

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問