2012-01-11 18 views
5

tôi đang cố gắng để có được biểu đồ từ màu của tôi (3 kênh) hình ảnh trong OpenCV nhưng mỗi khi tôi làm biểu đồ calcHist như thế này:Unhandled ngoại lệ sau khi đọc histogram (tạo ra với calcHist)

//int histSize[3]; 
//float hranges[2]; 
//const float* ranges[3]; 
//int channels[3]; 

ColorHistogram::ColorHistogram() 
{ 
    // Prepare arguments for a color histogram 
    histSize[0]= histSize[1]= histSize[2]= 256; 
    hranges[0]= 0.0; // BRG range 
    hranges[1]= 255.0; 
    ranges[0]= hranges; // all channels have the same range 
    ranges[1]= hranges; 
    ranges[2]= hranges; 
    channels[0]= 0; // the three channels 
    channels[1]= 1; 
    channels[2]= 2; 
} 

cv::MatND ColorHistogram::getHistogram(const cv::Mat &image) 
{ 
    cv::MatND hist; 
    // Compute histogram 
    cv::calcHist(&image, 
     1, // histogram of 1 image only 
     channels, // the channel used 
     cv::Mat(), // no mask is used 
     hist, // the resulting histogram 
     3, // it is a 3D histogram 
     histSize, // number of bins 
     ranges // pixel value range 
     ); 
    return hist; 
} 

enter image description here

Khi tôi cố gắng đưa kết quả vào ví dụ cv::minMaxLoc Tôi nhận được một ngoại lệ chưa được xử lý.

cv::Mat ColorHistogram::getHistogramImage(const cv::Mat &image){ 
    // Compute histogram first 
    cv::MatND hist = getHistogram(image); 
    // Get min and max bin values 
    double maxVal=0; 
    double minVal=0; 
    cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0); 
//.... 
} 

EDIT

Tôi không biết nếu điều này là rất quan trọng nhưng tôi nhận được lỗi này trong giao diện điều khiển:

OpenCV Error: Assertion failed (img.dims <= 2) in unknown function, file C:\slave\WinInstallerMegaPack\src\opencv\modules\core\src\stat.cpp, line 788

image 's tôi dims = 2

Trả lời

2

Bạn có thể không gọi số minMaxLoc có biểu đồ 3D (ví dụ: hist.dims == 3 là không đúng) . Dưới đây là mã cho minMaxLoc:

void cv::minMaxLoc(InputArray _img, double* minVal, double* maxVal, 
       Point* minLoc, Point* maxLoc, InputArray mask) 
{ 
    Mat img = _img.getMat(); 
    CV_Assert(img.dims <= 2); // <-- This is the line that is asserting for you... 

    minMaxIdx(_img, minVal, maxVal, (int*)minLoc, (int*)maxLoc, mask); 
    if(minLoc) 
     std::swap(minLoc->x, minLoc->y); 
    if(maxLoc) 
     std::swap(maxLoc->x, maxLoc->y); 
} 

Bạn sẽ phải tìm kiếm giá trị nhỏ nhất và tối đa trong biểu đồ 3D theo cách thủ công. Bạn có thể sử dụng NAryMatIterator để giúp giảm bớt tìm kiếm. Có một ví dụ về cách sử dụng nó với tài liệu. Ngoài ra, bạn có thể tìm thấy câu trả lời liên quan của tôi here.

Các vấn đề liên quan