SingleImage プロジェクトの作成
This content is not available in your language yet.
GbE-2 から 1 フレームの圧縮データを取得・復号し、標準的な画像表示ソフトで閲覧可能な PGM形式(Portable Graymap) のファイルとして保存するプログラムの作成手順です。
-
ソースコードの記述
メインファイル(
GbE2_SingleImage.cppなど)を開き、以下のコードに書き換えます。#include <stdio.h>#include <stdlib.h>#include <PUCLIB.h> // PUCLIB ヘッダーの読み込みint main() {printf("INFINICAM GbE-2 SingleImage キャプチャ開始...\n");// 1. SDKの初期化PUCRESULT ret = PUC_Initialize();if (ret != PUC_SUCCEEDED) {printf("エラー: SDKの初期化に失敗しました。ErrorCode: %d\n", ret);return EXIT_FAILURE;}// 2. ネットワーク上の GbE-2 デバイスを検索PUC_DETECT_FILTER filter = { 0 };filter.nDeviceTypeFlags = PUC_DETECT_TARGET_HAWK; // GbE-2 を指定PUC_DETECT_INFO detectInfo = { 0 };ret = PUC_DetectDevice2(&filter, &detectInfo);if (ret != PUC_SUCCEEDED || detectInfo.nDeviceCount == 0) {printf("エラー: GbE-2 カメラが見つかりませんでした。ErrorCode: %d\n", ret);return EXIT_FAILURE;}// 3. 検出した最初のデバイスをオープンPUC_HANDLE hDevice = NULL;ret = PUC_OpenDevice2(0, &hDevice);if (ret != PUC_SUCCEEDED) {printf("エラー: デバイスのオープンに失敗しました。ErrorCode: %d\n", ret);return EXIT_FAILURE;}// 4. 解像度の取得UINT32 width = 0, height = 0;ret = PUC_GetResolution(hDevice, &width, &height);if (ret != PUC_SUCCEEDED) {printf("エラー: 解像度の取得に失敗しました。ErrorCode: %d\n", ret);PUC_CloseDevice(hDevice);return EXIT_FAILURE;}printf("解像度: %u x %u ピクセル\n", width, height);// 5. 量子化テーブルの一括取得(デコード処理用)unsigned short qVals[PUC_Q_COUNT] = { 0 };ret = PUC_GetQuantization2(hDevice, qVals);if (ret != PUC_SUCCEEDED) {printf("エラー: 量子化テーブルの取得に失敗しました。ErrorCode: %d\n", ret);PUC_CloseDevice(hDevice);return EXIT_FAILURE;}// 6. 転送データサイズの取得とバッファの確保UINT32 xferDataSize = 0;ret = PUC_GetXferDataSize(hDevice, &xferDataSize);if (ret != PUC_SUCCEEDED) {printf("エラー: 転送データサイズの取得に失敗しました。ErrorCode: %d\n", ret);PUC_CloseDevice(hDevice);return EXIT_FAILURE;}// 圧縮データ格納用バッファの確保unsigned char* pCompressedBuffer = (unsigned char*)malloc(xferDataSize);// 復号(デコード)データ格納用バッファの確保 (横幅は4の倍数にアラインメント)UINT32 lineBytes = (width + 3) & ~3;unsigned long decodedBufferSize = (unsigned long)lineBytes * height;unsigned char* pDecodedBuffer = (unsigned char*)malloc(decodedBufferSize);if (pCompressedBuffer == NULL || pDecodedBuffer == NULL) {printf("エラー: メモリ割り当てに失敗しました。\n");free(pCompressedBuffer);free(pDecodedBuffer);PUC_CloseDevice(hDevice);return EXIT_FAILURE;}// 7. 1フレームデータの取得PUC_XFER_DATA_INFO xferDataInfo = { 0 };xferDataInfo.pData = pCompressedBuffer;xferDataInfo.nDataSize = xferDataSize;printf("1フレームのキャプチャを実行中...\n");ret = PUC_GetSingleXferData(hDevice, &xferDataInfo);if (ret == PUC_SUCCEEDED) {// 8. 圧縮データの復号(デコード処理)// GbE-2 向け処理として、SDK内部で自動的に 180 度回転補正が行われますret = PUC_DecodeData(pDecodedBuffer, 0, 0, width, height, lineBytes, pCompressedBuffer, qVals);if (ret == PUC_SUCCEEDED) {// 9. 復号した画像を PGM (P5) フォーマットで保存const char* filename = "captured_image.pgm";FILE* fp = NULL;if (fopen_s(&fp, filename, "wb") == 0 && fp != NULL) {// PGM ヘッダーの書き込み (P5 / 幅 / 高さ / 最大階調値 255)fprintf(fp, "P5\n%u %u\n255\n", width, height);// 有効画像データ部分を 1 行ずつ書き込みfor (UINT32 y = 0; y < height; y++) {fwrite(pDecodedBuffer + (y * lineBytes), sizeof(unsigned char), width, fp);}fclose(fp);printf("SUCCESS: PGM画像ファイルを保存しました (%s)\n", filename);} else {printf("エラー: ファイルの保存に失敗しました。\n");}} else {printf("エラー: 画像データの復号に失敗しました。ErrorCode: %d\n", ret);}} else {printf("エラー: 画像データの取得に失敗しました。ErrorCode: %d\n", ret);}// 10. メモリ解放とデバイスのクローズfree(pCompressedBuffer);free(pDecodedBuffer);PUC_CloseDevice(hDevice);return EXIT_SUCCESS;} -
ビルドと実行
Ctrl+Shift+Bを押してプロジェクトをビルドします。- 実行ファイル(
.exe)と同じフォルダーにpuclib.dll等が配置されていることを確認します。 Ctrl+F5で実行します。プロジェクトフォルダー直下にcaptured_image.pgmが生成されれば成功です。
PGM フォーマットとは?
Section titled “PGM フォーマットとは?”PGM(Portable Graymap Format) は、テキスト形式のヘッダーとバイナリ形式のピクセルデータで構成される、非常にシンプルな構造のグレースケール画像フォーマットです。
ファイルの基本構造 (P5 形式)
Section titled “ファイルの基本構造 (P5 形式)”P5800 600255[バイナリのピクセルデータ(幅×高さ バイト)]- マジックナンバー (
P5): バイナリ形式のグレースケール画像であることを示します。 - 画像の幅と高さ:
800 600のように、ピクセル単位の解像度を指定します。 - 最大輝度値 (
255): 各ピクセルの最大階調値(8bit モノクロの場合は255)を指定します。 - ピクセルデータ: 改行の直後から、輝度配列(1ピクセル=1バイト)がそのまま並びます。
