2014-05-06 97 views
1

我試圖在感興趣的圓形區域上平均圖像的像素值。我正在嘗試使用cvAvgSdv,它返回一個合理的平均值,但爲零標準差。我也嘗試cvCountNonZero這也返回零。必須是我正在犯的一個基本錯誤,但希望有人能指出。 roi.png看起來正確(黑色背景上正確位置的白點)。我完整的代碼如下(VS C++ 2010速成,Opencv245):帶遮罩的OpenCV和cvAvgSdv(roi)

#include <opencv/cv.h> 
#include <opencv2/highgui/highgui.hpp> 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
IplImage* src; 
if(argc >= 2 && (src=cvLoadImage(argv[1], 0))!= 0) 
{ 
    IplImage * roi; 
    roi = cvCreateImage(cvGetSize(src), 8, 1); 

    int n; 
    int centre_x = 396, centre_y = 317; 
    CvScalar pixel_mean, pixel_stdev; 

    cvZero(roi); 
    cvCircle(
     roi, 
     cvPoint(centre_x, centre_y), 
     15, //radius<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     cvScalar(255), 
     -1, 8, 0 
    ); 
    cvAvgSdv(src, &pixel_mean, &pixel_stdev, roi); 
    n = cvCountNonZero(roi); 

    printf 
    (
     "center x: %d y: %d A: %d B: %d av: %f stdev: %f n: %d\n", 
     centre_x, 
     centre_y, 
     15, 
     15, 
     pixel_mean, //new 
     pixel_stdev, //new 
     n //new 
    ); 

    cvSaveImage("roi.png", roi, 0); 
} 
} 

感謝

+0

這不是一個d bird的鳥。噢,我最終解決了這個問題。錯誤在於printf。有必要明確地選擇輸出cvScalars的哪些部分。將「.val [0]」添加到pixel_mean和pixel_stdev的末尾,它可以工作。 – user1228123

+0

總結:改爲: – user1228123

回答

1

錯誤的printf和使用cvScalars的。使用pixel_mean.val[0]pixel_stdev.val[0]代替pixel_meanpixel_stdev。該代碼段成爲:

printf 
(
    "center x: %d y: %d A: %d B: %d av: %f stdev: %f n: %d\n", 
    centre_x, 
    centre_y, 
    15, 
    15, 
    pixel_mean.val[0], //new 
    pixel_stdev.val[0], //new 
    n //new 
); 

一個更安全的方法是獨立printf的每個變量,那麼也沒關係,如果你忘了.val[0]部分:

printf 
(
    "center x: %d y: %d A: %d B: %d", 
    centre_x, 
    centre_y, 
    15, 
    15 
); 
printf(" av: %f", pixel_mean.val[0]); //new 
printf(" stdev: %f", pixel_stdev.val[0]); //new 
printf(" n: %d\n", n); //new 

看起來有點麻煩,但它如果忘記.val[0]並不重要,所以更安全。