Высота и ширина изображения меняются местами при чтении с использованием opencv imread

Когда я читаю изображение с помощью функции opencv imread, я обнаруживаю, что его высота и ширина меняются местами, как и должно быть. Как и мое исходное изображение имеет размеры (610 на 406), но при чтении с использованием функции opencv :: imread его размеры составляют 406 на 610. Кроме того, если я поверну исходное изображение перед его передачей в функцию, то также без изменений. Прочитанное изображение по-прежнему имеет исходные размеры.

Пожалуйста, просмотрите пример кода и изображения для пояснения: Итак, ниже я предоставил входные изображения: одно оригинальное, а второе повернутое (я повернул его с помощью команды поворота Windows, щелкнув правой кнопкой мыши и выбрав «повернуть вправо»). Вывод, который я получаю для обоих изображений, одинаков. Мне кажется, что вращающееся изображение практически не меняло своей формы. Я так думаю, потому что, когда я пытаюсь поместить сюда повернутое изображение, оно показывало только неповернутую его версию (в предварительном просмотре), поэтому мне пришлось сделать снимок экрана, а затем вставить его. здесь.

Это код:

import cv2
import numpy as np
import sys
import os

image = cv2.imread("C:/img_8075.jpg")
print "image shape: ",image.shape
cv2.imshow("image",image)
cv2.waitKey(0)
image2 = cv2.imread("C:/img_8075_Rotated.jpg")
print "image shape: ",image2.shape
cv2.imshow("image",image2)
cv2.waitKey(0)

Результат, который я получаю: форма изображения: (406,610,3) форма изображения: (406,610,3) для обоих изображений.

Я не могу вставлять сюда изображения ввода / вывода, поскольку там написано, что у вас должно быть «10 репутации», и я только что присоединился. Любые предложения были бы полезны. Благодарность!


person sm08    schedule 21.04.2015    source источник
comment
Одинаковые размеры даже после поворота изображения? Вы уверены, что что-то не упустили?   -  person a-Jays    schedule 21.04.2015
comment
как вы узнали, что размеры поменяны местами? .cols должна соответствовать ширине исходного изображения, а .rows - высоте исходного изображения. Если это не так, возможно, ваша программа просмотра изображений внутренне поворачивает изображения перед отображением?!?   -  person Micka    schedule 21.04.2015
comment
Привет, Мика, я думаю, ты прав, говоря, что моя программа просмотра изображений внутренне повернула изображение перед отображением. Но я хочу использовать это повернутое изображение только в качестве входных данных для моего opencv (функция imread). Я работаю над проектом класса, в котором я читаю изображения из папки, чтобы создать ее составное изображение. Поэтому иногда изображения в папке ориентированы неправильно. Итак, я поворачиваю их (с помощью щелчка правой кнопкой мыши в Windows - ›команды поворота вправо). Но opencv читает только исходное изображение. Что я должен делать?   -  person sm08    schedule 22.04.2015


Ответы (2)


Я считаю, что вы просто путаете условности. Доступны структуры OpenCV Mat (ROW, COLUMN).

Таким образом, изображение с разрешением 1920 x 1080 будет состоять из 1080 ROWS на 1920 COLUMNS (1080,1920).

person CodyF    schedule 21.04.2015
comment
Вы можете найти больше информации об этом здесь; docs.opencv.org/modules/core/doc/basic_structures. html # mat-mat - person Nallath; 21.04.2015
comment
Эй, я знаю, что дело не в условностях. Речь идет о чтении изображения, которое было повернуто с помощью команды «Windows-› щелкните правой кнопкой- ›повернуть вправо / влево». Я считаю, что это вращение выполняется только для просмотра и не меняет форму внутри файла изображения. Но я хочу, чтобы моя функция opencv считывала повернутое изображение (поскольку другое не ориентировано должным образом). Как я могу это сделать? - person sm08; 22.04.2015
comment
Почему бы просто не повернуть изображение в opencv после его прочтения; opencvexamples.blogspot.com/2014/01/ - person CodyF; 22.04.2015
comment
Привет, спасибо за предложение. Однако я не могу этого сделать, поскольку создаю приложение, которое считывает несколько изображений из папки для создания составного изображения (например, коллажа). Некоторые изображения в папке были повернуты, а некоторые оставлены как есть (в основном, все хорошо ориентированы). Но эта обновленная информация об ориентации исчезает, когда они читаются :( - person sm08; 22.04.2015
comment
Или ... вы всегда можете повернуть их в приложении, которое, как вы знаете, изменит базовое растровое изображение. Например, MS Paint или GIMP - person CodyF; 22.04.2015
comment
Я пробовал вращать в MS Paint. Но это не сработало. Дала мне такой же результат. - person sm08; 22.04.2015
comment
Ох, теперь я понимаю, о чем вы говорите, вам следует опубликовать свой код. Я только что проверил, и поворот изображений в Windows Photo Viewer действительно поворачивает реальное изображение. Так что у вас не должно быть проблемы, которую вы видите ... - person CodyF; 22.04.2015
comment
отредактировал мой пост, чтобы иметь код и результат. И да, даже я думал, что вращающееся изображение в программе просмотра фотографий вращает базовое растровое изображение, но, я думаю, в конечном итоге это не так. - person sm08; 22.04.2015
comment
Я протестировал ваш код, и он отлично работал у меня с изображением, повернутым в программе просмотра фотографий MS, или просто с помощью правой кнопки мыши повернуть влево / вправо. Я бы посоветовал проверить простые вещи, например пути к файлам. Результаты: форма изображения: (480, 640, 3) форма изображения: (640, 480, 3) - person CodyF; 24.04.2015

Обычно Mat.rows представляют высоту изображения, а Mat.cols - ширину изображения.

person an unique monkey    schedule 21.04.2015