2015-02-16 3 views
0

Я пытаюсь вычислить среднее (элемент за элементом) списка матриц. Во-первых, я делаю элемент суммы по элементу а вот код, я используюСумма мата в openCV

Mat imageResult = videoData[round(timestampInstImages[indexImg] * 100)]; 
for (double frame = (timestampInstImages[indexImg] + timeBetweenFields); frame < (timestampInstImages[indexImg] + 1); frame += timeBetweenFields) 
{ 
    double roundedTimestamp = round(frame * 100); 
    if (!videoData[roundedTimestamp].empty()) 
    { 
      cout << "imageResult " << imageResult.at<int>(10,10) << endl; 
      cout << "videoData[roundedTimestamp] " << videoData[roundedTimestamp].at<int>(10,10) <<endl; 
      imageResult += videoData[roundedTimestamp]; 
      cout << "Result : " << imageResult.at<int>(10,10) << endl; 
    } 
} 

Вот первые строки вывода я получил:

imageResult 912924469 
videoData[roundedTimestamp] 929701431 
Result : 1842625900 //(912924469 + 929701431) It looks good 
imageResult 1842625900 
videoData[roundedTimestamp] 963386421 
Result : -1493214815 // Not sure how the sum of 963386421 and 1842625900 returns this value??? 
imageResult -1493214815 
videoData[roundedTimestamp] 963518006 
Result : -536905769 
imageResult -536905769 

Как вы можете видеть выше , в сумме что-то не так. Не уверен, что это. Любая идея, что происходит?

+0

вы ** должны ** получить доступ к cv :: Mat с правильным типом. предполагая, что ваши видеоданные содержат рамки bgr, это должно быть сделано следующим образом: 'imageResult.at (10,10)'. int определенно не так. – berak

ответ

2

Чтобы накапливать несколько кадров в рамке «сумма», вам нужна одна с большей глубиной, иначе вы будете переполнять (или насыщать) ее.

Mat acc(height,width,CV_32FC3,Scalar::all(0)); 

cv::accumulate(frame,acc); 
cv::accumulate(frame,acc); 
cv::accumulate(frame,acc); 

acc /= 3; 
Mat mean; 
acc.convertTo(mean, CV_8UC3); 
+0

Спасибо. оно работает – Maystro

Смежные вопросы