2014-11-13 7 views
-1

Я пытаюсь написать код, который использует OpenCV, чтобы сначала преобразовать видео, кадр за кадром в его цветность g, g, а затем сделать это в гистограмму для сравнения. Тем не менее, у меня возникают некоторые проблемы, когда некоторые операции не разрешаются на векторах или матрицах (и наоборот).Векторный индекс Out Of Range opencv C++

Mat src, res, out, hsv_vid; 
vector<Mat> spl; 
Mat spl_r, spl_g, spl_b; 
Mat r_chroma, g_chroma, frame_chroma; 

for(;;){ 
    cap1 >> src; //read video frame into src matrix 
    if (src.empty()) break; 

    //extract channels 
    split(src, spl); 
    spl_r = spl[2]; 
    spl_g = spl[1]; 
    spl_b = spl[0]; 

    //convert whole frame to chromaticity 
    r_chroma = spl_r/(spl_r + spl_g + spl_b); 
    g_chroma = spl_g/(spl_r + spl_g + spl_b); 

    //convert matrix to vector 
    vector<vector<Mat>> r_chroma_vec; 
    for (int i = 0; i < r_chroma.rows; i++) { 
     vector<Mat> row;  
     r_chroma.row(i).copyTo(row); 
     r_chroma_vec.push_back(row); 
    } 
    vector<vector<Mat>> g_chroma_vec; 
    for (int i = 0; i < g_chroma.rows; i++) { 
     vector<Mat> row;  
     g_chroma.row(i).copyTo(row); 
     g_chroma_vec.push_back(row); 
    } 

    merge(r_chroma_vec, frame_chroma); 
    merge(g_chroma_vec, frame_chroma); 

} //end for(;;) 

//disp chromaticity test img 
vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //use .PNG compression 
compression_params.push_back(9); 
try { imwrite("ChromaTest.png", frame_chroma, compression_params); } //write output matrix to file 
catch (runtime_error& ex) { return -2; } 

Если я хочу, чтобы иметь возможность сделать Деление & дополнения, чтобы получить мою цветность тогда r_chroma & g_chroma должен быть матрицами, то я не могу объединить их. Если у меня есть r_chroma & g_chroma как векторы, то я могу объединить их, но я не могу выполнять математические операции над ними.

Есть ли способ слить() 2 матрицы, или я об этом ошибаюсь? Я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении.

Спасибо за чтение!

[изменить]: Добавлена ​​матрица -> векторное преобразование, чтобы сделать возможным объединение в вывод матрицы.

+1

'Vector Подстрочный Out Of Range' Это означает, что вы обращаетесь к записи недоступный в векторе. Если вы использовали массивы, произошла бы одна и та же ошибка (но была бы авария или тишина из среды выполнения). Так что это действительно не проблема 'std :: vector'. – PaulMcKenzie

+0

@PaulMcKenzie Я еще не запускал его. VS2012 просто дает мне красные подчеркивания, потому что некоторые операции не допускаются с помощью матриц/векторов (т. Е. Слияния). Но вы говорите, что существует ошибка границ с spl []? – user1846359

+0

Может быть, это только я, но у этого цикла есть замкнутая скобка? Возможно, вы должны показать весь код, а не просто фрагмент. –

ответ

1

cv::merge является аналогом cv :: split, 1st arg является vector<Mat> или Mat [], 2nd arg является результатом Mat.

так что вы просто получили аргументы неправильно.

другая проблема в вашем подходе эта часть:

r_chroma = spl_r/(spl_r + spl_g + spl_b); 

да, вы можете использовать математику операторов, но (spl_r + spl_g + spl_b) насытит, результат Mat еще Uchar один.

[править]: первый попробовать на фиксируя вектор проблемы:

vector<Mat> spl_new; 
spl_new.push_back(spl_b); // <-- ??? 
spl_new.push_back(g_chroma); 
spl_new.push_back(r_chroma); 

Mat result; 
merge(spl_new, result); 
+0

Хммм. Вы говорите, что мой r_chroma & g_chroma должен быть вектором ? Но если это так, то я не могу добавлять и делить. Кроме того, если я не могу использовать r, g = R, G/(R + G + B), то как я должен идти о получении цветности? Спасибо за помощь до сих пор :) – user1846359

+0

нет, вы должны упаковать их в вектор раньше. каков будет третий (б) канал в изображении результата? оригинальный? – berak

+0

Я внес изменения в сообщение. Я использовал для циклов просто поместить матрицу (в результате математических операций) в вектор, чтобы сделать возможным объединение в выходной массив.Но я получаю ошибку за пределы. Я все еще должен работать над этим. Но что вы думаете до сих пор? – user1846359