Я пытаюсь прочитать изображение и назначить некоторые значения прочитанного изображения другому новому, используя этот код:
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)
вызывает проблему. Может кто-то объяснить это мне?
виновник находится здесь:
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);
В дополнение к ответу Berak
ниже, я думаю, вы должны сделать следующее:
Initialize result image with zeros:
я чувствую, что есть проблема. Ваш dx
получает прирост на 30
в каждом цикле, поэтому ваш for loop
будет работать только для нескольких случаев. Но какими должны быть значения в ячейках result
которые не могли быть заполнены во время for loop
result
изображение так, чтобы у каждого пикселя было какое-то значение (по крайней мере, ноль). А также обратный порядок dx
и dy
Несмотря на то, что документация не совсем понятна, функция 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 в качестве внутреннего цикла выполняется намного быстрее.