OpenCV: присвоение новых значений матричным элементам

0

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

cv::Mat source = cv::imread("001.jpg");
cv::cvtColor( source , source , CV_BGR2GRAY );
cv::Mat result = cv::Mat( source.rows, source.cols, source.type() );

int dx = 0; 
int dy = 0;
int len = 30;

for( int i = 0; i < source.cols - len; i ++ )
{
    dx = i + len;

    for( int j = 0; j < source.rows; j++ )
    {
        dy = j + 0.5 * dx;
        if( 0 <= dx && dx < source.cols && 0 <= dy && dy < source.rows )
        {
             result.at<uchar>(i,j) = source.at<uchar>(dx,dy);
        }
    }
}

Но код останавливается после запуска, не выдавая никакого сообщения об ошибке. Я попытался отладить его и заподозрил результат result.at<uchar>(i,j) = source.at<uchar>(dx,dy) вызывает проблему. Может кто-то объяснить это мне?

Теги:
opencv
image-processing
image
matrix

3 ответа

2
Лучший ответ

виновник находится здесь:

 result.at<uchar>(i,j) = source.at<uchar>(dx,dy);

вы получили i, j, а также dx dy в обратном порядке.

it mat.at<type>(row,col); в opencv, а не mat.at<type>(x,y);

  • 0
    хорошо, в этом все дело. Спасибо.
1

В дополнение к ответу Berak ниже, я думаю, вы должны сделать следующее:

Initialize result image with zeros: я чувствую, что есть проблема. Ваш dx получает прирост на 30 в каждом цикле, поэтому ваш for loop будет работать только для нескольких случаев. Но какими должны быть значения в ячейках result которые не могли быть заполнены во время for loop

  • 0
    Да, я пытался показать это с помощью imshow. Это когда он перестает реагировать.
  • 0
    если условие удовлетворяет, то некоторые из ваших пикселей получают значение, но как насчет пикселей, которые не получили никакого значения ... поэтому инициализируйте result изображение так, чтобы у каждого пикселя было какое-то значение (по крайней мере, ноль). А также обратный порядок dx и dy
0

Несмотря на то, что документация не совсем понятна, функция at используется как cv::Mat::at(y,x). Вероятно, это и вызвало эту проблему.

Кроме того, чтобы сделать ваш код более эффективным, вы должны инвертировать ваши циклы x и y следующим образом:

for( int j = 0; j < source.rows; j ++ )
{

    for( int i = 0; i < source.cols- len; i++ )
    {
        dx = i + len;
        dy = j + 0.5*dx;
        if( 0 <= dx && dx < source.cols && 0 <= dy && dy < source.rows )
        {
             result.at<uchar>(j, i) = source.at<uchar>(dy, dx);
        }
    }
}

Это связано с тем, что в OpenCV изображения сохраняются по строкам, поэтому определение цикла x в качестве внутреннего цикла выполняется намного быстрее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню