3

私はiOSでc++のOpenCVを使用して画像処理を行っています。周囲光が不十分で、画像を適切に処理できない場合があります。周囲光を検出する適切な方法が見つからなかったため、代わりに画像の明るさを検出しようとしました。

この回答は、輝度値またはYをYUV形式で使用することを提案しています。だから私はこの答えに従って、画像をYUV形式に変換した後、マット画像から形成されたピクセルにアクセスします。

- (void)processImage:(Mat&)image
{    
    Mat frame_yuv;
    cvtColor( image, frame_yuv, CV_BGR2YUV );

    uint8_t* pixelPtr = (uint8_t*)frame_yuv.data;
    int cn = frame_yuv.channels();
    for(int i = 0; i < frame_yuv.rows; i+=50)
    {
        for(int j = 0; j < frame_yuv.cols; j += 50)
        {
            Scalar_<uint8_t> yuvPixel;
            yuvPixel.val[0] = pixelPtr[i*frame_yuv.cols*cn + j*cn + 0]; // Y
            yuvPixel.val[1] = pixelPtr[i*frame_yuv.cols*cn + j*cn + 1]; // U
            yuvPixel.val[2] = pixelPtr[i*frame_yuv.cols*cn + j*cn + 2]; // V

            // do something with YUV values...
            std::cout << "Y: " << yuvPixel.val[0] << endl;
            std::cout << "U: " << yuvPixel.val[1] << endl;
            std::cout << "V: " << yuvPixel.val[2] << endl;
        }
    }
}

これが私にとって奇妙な結果を含むログのいくつかの行であり、「Y」、「U」、または「V」の値は私の理解ではそれほど多くないはずです。私が見逃したこと、または何が間違っていたかを教えてください。どうもありがとうございます。

Y: P
U: \204
V: \206
Y: Q
U: \201
V: \207
Y: K
U: \205
V: \211
Y: H
U: \203
V: \210
Y: G
U: \202
V: \210
Y: H
U: \201
V: \210
Y: H
U: \202
V: \211
Y: \326
U: \200
V: \204
Y: \377
U: \200
V: \200
Y: \377
U: \200
V: \200
Y: \377
U: \200
V: \200
Y: \376
U: |
V: \201
Y: \313
U: x
V: \210
Y: \231
U: ~
V: \204
Y: \214
U: ~
V: \204
Y: \205
U: |
V: \204
Y: \221
U: 
V: \202
4

2 に答える 2

4

これがあなたがそれをかなり簡単に行うことができる方法です、私のために働きます!

PasteBinにも投稿されています: https ://pastebin.com/tA1R8Qtm

// -----------------------------------------------------
// ---------- FIND AVG LUMINENCE OF FRAME --------------
// -----------------------------------------------------

// Assuming you have a cv::Mat to start with called "input_mat"
cv::Mat grayMat; 
cv::cvtColor(input_mat, grayMat, CV_BGR2GRAY);

int Totalintensity = 0;
for (int i=0; i < grayMat.rows; ++i){
    for (int j=0; j < grayMat.cols; ++j){
        Totalintensity += (int)grayMat.at<uchar>(i, j);
    }
}

// Find avg lum of frame
float avgLum = 0;
avgLum = Totalintensity/(grayMat.rows * grayMat.cols);
于 2017-08-09T19:33:06.767 に答える
2

ログ出力の理由は、ピクセル値がタイプであるためです。これは、コンソールに出力しようとすると(少なくとも、iOSでは)uint8_t解釈されます。unsigned charしたがって、ログ出力はそのピクセル値で表される文字です。int対応する数値を出力するには、次のように値をにキャストします。

std::cout << "Y: " << (int)yuvPixel.val[0] << std::endl;
std::cout << "U: " << (int)yuvPixel.val[1] << std::endl;
std::cout << "V: " << (int)yuvPixel.val[2] << std::endl;

また、投稿されたコードは同じ要素を3回出力しており、bgrPixel未定義でした。このスニペットのエラーも修正しました。

輝度情報のみに関心がある場合は、代わりに電話することができます

cv::cvtColor(image, frame_yuv, CV_BGR2GRAY);

これはYUVのYチャンネルと同じ色変換を行いますが、より効率的になります。

于 2013-03-25T15:36:55.673 に答える