2014-10-28 4 views
0

с небольшим количеством проблем с этим. Для простого примера, скажем, я хотел посмотреть значения интенсивности серого изображения и записать их на новый массив, но скажем, изменить интенсивность на определенную величину. Как я буду делать это с помощью opencv? Я что-то вдоль линий это попробовать и практики пытаются:Запись значения пикселя в пустую матрицу

int main(int argc, char** argv){ 

    Mat img = imread(argv[1], CV_LOAD_IMAGE_UNCHANGED), img_grey, dst; 

    if (img.empty()) 
    { 
     return -1; 
    } 

    cvtColor(img, img_grey, CV_BGR2GRAY); 

    dst = Mat::zeros(img_grey.size(), img_grey.type()); 

    for 
     (int x = 1; x < dst.rows - 1; x++) 
    { 
     for (int y = 1; y < dst.cols - 1; y++) 
     { 

      dst.at<uchar>(y, x) = x; 

     } 
    } 

    namedWindow("New", CV_WINDOW_AUTOSIZE); 
    namedWindow("Original", CV_WINDOW_AUTOSIZE); 

    imshow("New", dst); 
    imshow("Original", img); 



    waitKey(0); 
    return 0; 

} 
+0

Кажется хорошо, когда я строю, но я получаю эту ошибку: первого шанса исключение в 0x000007FEFD00940D в TEST.exe: Microsoft C++ исключение: резюме :: Exception в ячейке памяти 0x00000000001BF4C0. Если есть обработчик для этого исключения, программа может быть безопасно продолжена. –

ответ

1

Учитывая то, как вы доступ к изображению, вы должны изменить

dst.at<uchar>(y, x) = x; 

в

dst.at<uchar>(x, y) = x; 

За дополнительной информацией обращайтесь к Mat::at().


Edit: Как @Micka отметили, вы действительно должны переименовать x и y так x, как правило, предполагается, горизонтальная ось, которая соответствует «колонного направлении». Нормальный случай использования будет как:

for(int y = 0; y < mat.rows; y++) 
    for(int x = 0; x < mat.cols; x++) 
     mat.at<uchar>(y,x) = ...; 
+0

Отлично, спасибо. –

+2

вы действительно должны переименовать свои x и y, так как x обычно считается горизонтальной осью, которая соответствует «столбцу» – Micka

+0

@ Микка Хорошая точка, добавленная к ответу, чтобы дать понять. – herohuyongtao