1

x265 エンコーダー ( https://x265.readthedocs.org/en/default/api.html ) を使用したエンコード処理中に、新しい画像がエンコードされた後に、画像のピクセル値 (具体的には Y チャネルの値) を .txt ファイルに書き込みたい(理由は重要ではありません)。そのために、クラス x265_picture の「planes」変数を使用しています。

x265_picture* pic_out; # variable where encoded image is to be stored 
... # encoding process
uint8_t *plane = (uint8_t*)pic_out->planes[0]; 
uint32_t pixelCount = x265_picturePlaneSize(pic_out->colorSpace, m_param->sourceWidth, m_param->sourceHeight, 0);
ofstream out_file("out_file.txt");

for (uint32_t j = 0; j < pixelCount; j++) # loop for all pixels
{
    int pix_val = plane[j];
    out << pix_val;
}

ofstream.close()

しかし、出力データを画像に再構築すると、

ここに画像の説明を入力

それ以外の

ここに画像の説明を入力

または別の例:

ここに画像の説明を入力

それ以外の

ここに画像の説明を入力

(色は重要ではありません。「縞模様」が問題です)

出力ファイルには、(明らかに) 正しい順序 (89、90、102、98 など) のデータの間隔があり、その後に常に等しい数の長いシーケンス (235、235、235、235、または 65、65 など) が続くように見えます。 65,65...)、ストライプを「作成」します。誰かが私に欠けているものを教えてもらえますか?

4

1 に答える 1

1

みんなありがとう、これを解決しました...キーは「src + = srcStride」を使用しています:

ofstream out_file("out_file.txt");
int srcStride = pic_out->stride[0] / sizeof(pixel);
uint8_t* src = (uint8_t*) pic_out->planes[0];

for (int y = 0; y < m_param->sourceHeight; y++, src += srcStride)
{
    for (int x = 0; x < m_param->sourceWidth; x++)
        out_file << (int)(src[x]) << ",";
}
out_file.close();
于 2015-10-06T09:41:18.780 に答える