Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cv::VideoCapture ignores orientation metadata #15499

Closed
shinexunju opened this issue Sep 11, 2019 · 28 comments
Closed

cv::VideoCapture ignores orientation metadata #15499

shinexunju opened this issue Sep 11, 2019 · 28 comments
Assignees
Labels
category: videoio effort: few days Extra design work may required (think about tests too). Or prepare a great tutorial. feature Hackathon https://opencv.org/opencv-hackathon-starts-next-week/
Milestone

Comments

@shinexunju
Copy link

shinexunju commented Sep 11, 2019

For some videos, using get() to get VideoCapture's width/height property, the results are not correct (the width and height are swapped).

I found that there is a rotate tag in the video metadata (ref. link ffmpeg get orientation inverted), e.g.,

Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2019-09-10T04:58:23.000000Z
    location        : +31.2664+120.7302/
    location-eng    : +31.2664+120.7302/
    com.android.version: 10
  Duration: 00:00:25.15, start: 0.000000, bitrate: 42894 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt470bg/bt470bg/smpte170m), 3840x2160, 42808 kb/s, SAR 1:1 DAR 16:9, 30.01 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 90
      creation_time   : 2019-09-10T04:58:23.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -90.00 degrees

Could this issue be considered in future releases?

@mshabunin
Copy link
Contributor

Do you have a recipe of how to create a video with this transformation?

@shinexunju
Copy link
Author

ffmpeg -i $INPUTVIDEO -metadata:s:v rotate="-90" -codec copy $OUTPUTVIDEO (ref. link https://gist.github.com/ViktorNova/1dd68a2ec99781fd9adca49507c73ee2)

before:

Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp41isom
    creation_time   : 2017-12-13T14:35:34.000000Z
  Duration: 00:00:05.93, start: 0.000000, bitrate: 3853 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 3673 kb/s, 30 fps, 30 tbr, 30k tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2019-03-28T10:11:38.000000Z
      handler_name    : VideoHandler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 194 kb/s (default)
    Metadata:
      creation_time   : 2019-03-28T10:11:38.000000Z
      handler_name    : SoundHandler

after:

Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:00:05.93, start: 0.000000, bitrate: 3857 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 3673 kb/s, 30 fps, 30 tbr, 30k tbn, 60 tbc (default)
    Metadata:
      rotate          : 90
      handler_name    : VideoHandler
    Side data:
      displaymatrix: rotation of -90.00 degrees
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 194 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

get() with CAP_PROP_FRAME_WIDTH/HEIGHT return same results in these two videos.

@ghost
Copy link

ghost commented Nov 5, 2019

You know, mediainfo also doesn't swap width and height when rotation metadata is present.
Before:

testdata/python/videos$ mediainfo mpeg4.mp4
General
Complete name                            : mpeg4.mp4
Format                                   : MPEG-4
Format profile                           : Base Media / Version 2
Codec ID                                 : mp42 (mp42/mp41)
File size                                : 16.3 KiB
Duration                                 : 1 s 200 ms
Overall bit rate                         : 112 kb/s
Encoded date                             : UTC 2007-01-30 16:16:11
Tagged date                              : UTC 2007-01-30 16:16:11

Video
ID                                       : 1
Format                                   : MPEG-4 Visual
Format profile                           : Advanced Simple@L3
Format settings                          : BVOP
Format settings, BVOP                    : Yes
Format settings, QPel                    : No
Format settings, GMC                     : No warppoints
Format settings, Matrix                  : Default (H.263)
Codec ID                                 : mp4v-20
Duration                                 : 1 s 200 ms
Bit rate mode                            : Constant
Bit rate                                 : 100.0 kb/s
Width                                    : 176 pixels
Height                                   : 144 pixels
Display aspect ratio                     : 1.222
Frame rate mode                          : Constant
Frame rate                               : 25.000 FPS
Color space                              : YUV
Bit depth                                : 8 bits
Scan type                                : Progressive
Compression mode                         : Lossy
Bits/(Pixel*Frame)                       : 0.158
Stream size                              : 14.4 KiB (88%)
Language                                 : English
Encoded date                             : UTC 2007-01-30 16:16:10
Tagged date                              : UTC 2007-01-30 16:16:11
Transfer characteristics                 : BT.601
Matrix coefficients                      : BT.601

Other #1
ID                                       : 2
Type                                     : Scene description
Format                                   : System Core
Codec ID                                 : mp4s-02
Duration                                 : 1 s 200 ms
Language                                 : English
Encoded date                             : UTC 2007-01-30 16:16:11
Tagged date                              : UTC 2007-01-30 16:16:11

Other #2
ID                                       : 3
Type                                     : Object description
Format                                   : System
Codec ID                                 : mp4s-01
Duration                                 : 1 s 200 ms
Language                                 : English
Encoded date                             : UTC 2007-01-30 16:16:11
Tagged date                              : UTC 2007-01-30 16:16:11

After:

testdata/python/videos$ ffmpeg -i mpeg4.mp4 -metadata:s:v rotate="-90" -codec copy mpeg4ro.mp4
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'mpeg4.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42mp41
    creation_time   : 2007-01-30T16:16:11.000000Z
  Duration: 00:00:01.20, start: 0.000000, bitrate: 111 kb/s
    Stream #0:0(eng): Video: mpeg4 (Advanced Simple Profile) (mp4v / 0x7634706D), yuv420p, 176x144 [SAR 1:1 DAR 11:9], 98 kb/s, 25 fps, 25 tbr, 600 tbn, 1k tbc (default)
    Metadata:
      creation_time   : 2007-01-30T16:16:11.000000Z
      handler_name    : Apple Video Media Handler
    Stream #0:1(eng): Data: none (mp4s / 0x7334706D), 0 kb/s (default)
    Metadata:
      creation_time   : 2007-01-30T16:16:11.000000Z
      handler_name    : Apple MPEG-4 Scene Media Handler
    Stream #0:2(eng): Data: none (mp4s / 0x7334706D), 0 kb/s (default)
    Metadata:
      creation_time   : 2007-01-30T16:16:11.000000Z
      handler_name    : Apple MPEG-4 ODSM Media Handler
Output #0, mp4, to 'mpeg4ro.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42mp41
    encoder         : Lavf57.83.100
    Stream #0:0(eng): Video: mpeg4 (Advanced Simple Profile) (mp4v / 0x7634706D), yuv420p, 176x144 [SAR 1:1 DAR 11:9], q=2-31, 98 kb/s, 25 fps, 25 tbr, 19200 tbn, 600 tbc (default)
    Metadata:
      creation_time   : 2007-01-30T16:16:11.000000Z
      handler_name    : Apple Video Media Handler
    Side data:
      displaymatrix: rotation of -90.00 degrees
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=   30 fps=0.0 q=-1.0 Lsize=      15kB time=00:00:01.16 bitrate= 108.6kbits/s speed=9.21e+03x    
video:14kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 6.649512%



testdata/python/videos$ mediainfo mpeg4ro.mp4 
General
Complete name                            : mpeg4ro.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom (isom/iso2/mp41)
File size                                : 15.4 KiB
Duration                                 : 1 s 200 ms
Overall bit rate mode                    : Constant
Overall bit rate                         : 105 kb/s
Writing application                      : Lavf57.83.100

Video
ID                                       : 1
Format                                   : MPEG-4 Visual
Format profile                           : Advanced Simple@L3
Format settings                          : BVOP
Format settings, BVOP                    : Yes
Format settings, QPel                    : No
Format settings, GMC                     : No warppoints
Format settings, Matrix                  : Default (H.263)
Codec ID                                 : mp4v-20
Duration                                 : 1 s 200 ms
Bit rate mode                            : Constant
Bit rate                                 : 98.5 kb/s
Width                                    : 176 pixels
Height                                   : 144 pixels
Display aspect ratio                     : 1.222
Rotation                                 : 90°
Frame rate mode                          : Constant
Frame rate                               : 25.000 FPS
Color space                              : YUV
Bit depth                                : 8 bits
Scan type                                : Progressive
Compression mode                         : Lossy
Bits/(Pixel*Frame)                       : 0.155
Stream size                              : 14.4 KiB (94%)
Language                                 : English
Transfer characteristics                 : BT.601
Matrix coefficients                      : BT.601

Width and height of the new video are the same. There is a new Rotation parameter though.
Note, that the trick doesn't work with avi files. So, I guess this rotation feature is rather a hack. Is there a spec or some other doc on how rotation metadata works, which video containers support it, what are valid values and how should it be handled?

@mshabunin
Copy link
Contributor

I see two ways here:

  • We can introduce new property CAP_PROP_AUTO_ROTATION which, when enabled, will apply transformation. It should be disabled by default to avoid breaking existing applications.
  • We can add a read-only property CAP_PROP_ROTATION which will return rotation value from container. It will be user's responsibility to apply transformation or not.

The second approach is simpler.

@GArik
Copy link
Contributor

GArik commented Nov 7, 2019

I would go with the second approach. It's not only simpler, it's saner as well.

@shinexunju
Copy link
Author

shinexunju commented Nov 7, 2019

  • We can introduce new property CAP_PROP_AUTO_ROTATION which, when enabled, will apply transformation. It should be disabled by default to avoid breaking existing applications.

I prefer the first option enabled by default. ffmpeg performs frame extraction with auto-rotation enabled, and the first option will be consistent with ffmpeg's.

BTW, most video players treated the rotation parameter transparently, and the first option is more transparent in a sense.

Another aspect, with opencv's videowriter, there is no flag for the rotation parameter. If we go with the first option, it will be simpler.

@asmorkalov asmorkalov added the Hackathon https://opencv.org/opencv-hackathon-starts-next-week/ label Jan 16, 2020
@asmorkalov asmorkalov changed the title CAP_PROP_FRAME_WIDTH/HEIGHT swapped cv::VideoCapture ignores orientation metadata Jan 31, 2020
@asmorkalov
Copy link
Contributor

Action items for Hackathon:

  • Introduce CAP_PROP_AUTO_ROTATION option with true by default.
  • Implement frames rotation in respect with metadata. The first priority -- FFMpeg.
  • Add test for the feature.

@preeti13456
Copy link

Instead of cap_prop_auto_rotation we can use cap_Frame(position parameters) to change the rotation along the rotated parameters .

@dsposito
Copy link

+1 Any update on this feature? Using imwrite() with VideoCapture results in images that are not the same orientation as the video.

@asmorkalov
Copy link
Contributor

#17452

@Lapshin
Copy link

Lapshin commented Jun 2, 2020

Hi there,

I faced the same problem, and have solutions.

I have only few hours experience with opencv and ffmpeg, and do not sure that the code written with optimal algorithms

The timings for sample program which opens video file and writes it to another file frame by frame:

no-rotation:
88.83s user 0.61s system 146% cpu 1:01.20 total

https://github.com/Lapshin/opencv/tree/ffmpeg_cap_consider_rotation_metadata__ffmpeg
117.99s user 0.65s system 155% cpu 1:16.20 total

https://github.com/Lapshin/opencv/tree/ffmpeg_cap_consider_rotation_metadata__opencv
104.45s user 6.79s system 132% cpu 1:23.90 total

tested with:

--     FFMPEG:                      YES
--       avcodec:                   YES (57.107.100)
--       avformat:                  YES (57.83.100)
--       avutil:                    YES (55.78.100)
--       avfilter:                  YES (6.107.100)
--       swscale:                   YES (4.8.100)
--       avresample:                YES (3.7.0)

@Lapshin
Copy link

Lapshin commented Jun 2, 2020

difference between solutions in implementation:
the first based on ffmpeg avfilter
the second based on opencv Mat operations

@Lapshin
Copy link

Lapshin commented Jun 2, 2020

lol, I made the measurements on the overloaded cpu :)

the new test times:
no-rotation:

65.11s user 0.58s system 146% cpu 44.720 total
64.19s user 0.16s system 147% cpu 43.737 total

https://github.com/Lapshin/opencv/tree/ffmpeg_cap_consider_rotation_metadata__ffmpeg

80.95s user 5.09s system 132% cpu 1:04.88 total
82.97s user 5.39s system 132% cpu 1:06.64 total
78.22s user 4.78s system 132% cpu 1:02.41 total

https://github.com/Lapshin/opencv/tree/ffmpeg_cap_consider_rotation_metadata__opencv

79.17s user 5.22s system 132% cpu 1:03.63 total
78.13s user 5.19s system 132% cpu 1:02.79 total
82.36s user 5.44s system 133% cpu 1:05.74 total

So, I'm confused about these timings...
It will be good if somebody can tell the computation complexity of ffmpeg rotation avfilter and cv::Mat.transpose() + cv::Mat.flip()

@asmorkalov
Copy link
Contributor

@Lapshin Thanks for your effort. OpenCV core provides cv::rotate for this purpose. Could you update your solution with OpenCV rotation and propose PR with the fix. OpenCV verison should be more portable and does not depend on FFMpeg version.

@Lapshin
Copy link

Lapshin commented Jun 4, 2020

@asmorkalov thank you for this clarification.

is it ok to make PR based on the master branch?

@asmorkalov
Copy link
Contributor

I suppose to rebase the PR to 3.4. We merge 3.4 to master regularly and fixes will appear in both branches.

@Lapshin
Copy link

Lapshin commented Jun 6, 2020

Done

@glenn-jocher
Copy link

glenn-jocher commented Oct 30, 2020

@Lapshin @asmorkalov hi I tried to use the proposed cv2 video rotation properties but they are not present in cv2 video capture objects.

cv2.__version__
Out[4]: '4.4.0'

cap.get(cv2.CAP_PROP_FRAME_COUNT)
Out[5]: 31.0

cap.get(cv2.CAP_PROP_AUTO_ROTATION)
Traceback (most recent call last):
  File "/Users/glennjocher/PycharmProjects/yolov5/venv/lib/python3.8/site-packages/IPython/core/interactiveshell.py", line 3417, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-f14478ca3566>", line 1, in <module>
    self.cap.get(cv2.CAP_PROP_AUTO_ROTATION)
AttributeError: module 'cv2.cv2' has no attribute 'CAP_PROP_AUTO_ROTATION'

cap.get(cv2.CAP_PROP_ROTATION) # same result

What is the current best practices method for handling portrait videos? I have two small test videos we use for YOLOv5 testing, one portrait one landscape, and we are investigating how to auto-detect the portrait orientation correctly:

https://github.com/ultralytics/yolov5/releases/download/v1.0/decelera_landscape.mov
https://github.com/ultralytics/yolov5/releases/download/v1.0/decelera_portrait.mov

Any help would be appreciated. Thanks!

@Lapshin
Copy link

Lapshin commented Oct 30, 2020

Hi @glenn-jocher,

This fix works only if opencv uses ffmpeg as video processing backend
Also, I am not sure that these changes merged to 4.4.0.

I see changes under tag 4.5.0. Look this f0271e5

Regards

@glenn-jocher
Copy link

@Lapshin oh, awesome! I'll wait for the opencv-python pip package (https://pypi.org/project/opencv-python/ on 4.4.0.44) to update and then I'll try it out, thank you!

melvinkokxw added a commit to melvinkokxw/face_emotion_detection that referenced this issue Nov 14, 2020
Workaround for OpenCV bug, where orientation of video is not detected properly.
opencv/opencv#15499
@mastmees
Copy link

mastmees commented Sep 2, 2021

well, as far as I can tell, this is a total disaster. The default behaviour of opencv API changed, but there is no way to detect it (if the captured frame image was rotated or not). Trying to disable rotation to ensure consistent results with

cv2.VideoCapture(filename,cv2.CAP_AUTO,(cv2.CAP_PROP_ORIENTATION_AUTO,False))

results in (I'm guessing because ffmpeg also needs to be at some specific version):

[ERROR:0] global /private/var/folders/24/8k48jl6d249_n_qfxwsl6xvm0000gn/T/pip-req-build-k95y01np/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (927) open VIDEOIO/FFMPEG: unsupported parameters in .open(), see logger INFO channel for details. Bailout
[ERROR:0] global /private/var/folders/24/8k48jl6d249_n_qfxwsl6xvm0000gn/T/pip-req-build-k95y01np/opencv/modules/videoio/src/cap.cpp (162) open VIDEOIO(AVFOUNDATION): raised OpenCV exception:
OpenCV(4.5.2) /private/var/folders/24/8k48jl6d249_n_qfxwsl6xvm0000gn/T/pip-req-build-k95y01np/opencv/modules/videoio/src/backend_static.cpp:26: error: (-213:The function/feature is not implemented) VIDEOIO: Failed to apply invalid or unsupported parameter: [49]=0 / 0 / 0x00000000 in function 'applyParametersFallback'

This should absolutely have been done so that the existing code would not break (by not rotating frames by default, as before), but right now when I made this upgrade (using mac ports)

Uninstalling opencv-python-4.4.0.44:
Successfully uninstalled opencv-python-4.4.0.44
Successfully installed opencv-python-4.5.3.56

all the existing code that used cv2.VideoCapture() broke on non-zero degrees rotated videos. And just going in and changing every place will not work because I cannot ensure the specific set of versions being present on all platforms where the code runs.

@Lapshin
Copy link

Lapshin commented Sep 4, 2021

I agree, default value should be false to not ruin software after update
I don't know why requirements was to set it true.. #15499 (comment)
This mistake should be fixed asap, because changing it in future will affect more and more people

@asmorkalov, are you in agreement with it?

@alalek
Copy link
Member

alalek commented Sep 4, 2021

Problem looks like the processing of undocumented / unsupported cases or exploiting bugs.
Library would be improved soon or later and such user code becomes broken.

Some projects maintains behavior of old releases through runtime policies (e.g, CMake policies) - but it is a maintenance hell and some changes still may missing accurate policies update.
But it is more important to have mature tests on the side of user code and run them after dependencies upgrades (or playing with its policies).


I don't know why requirements was to set it true..

See these threads about imread and orientation story: #7638 (feature PR) #6348 (raised issue) #7638 (PR with control option)


This instruction may help:


cv2.VideoCapture(filename,cv2.CAP_AUTO,(cv2.CAP_PROP_ORIENTATION_AUTO,False))

This property is not supported as "open" property for now.
Separate .set() call is required. This should be improved.

@mastmees
Copy link

mastmees commented Sep 4, 2021

I don't understand. Are you saying that this code:

video = cv2.VideoCapture(filename)
res, frame = video.read()
video.release()

is somehow using the opencv in undocumented, unsupported way or exploiting bugs? If that is indeed the case, then I would say you guys need to write less bugs :)

in opencv 4.4 it would always return a first frame of a video, unrotated. in opencv 4.5 it will return a rotated version of a frame if the video has rotation tag. Clearly, this is breaking backwards compatibility and there is absolutely no good reason to do it.

@alalek
Copy link
Member

alalek commented Sep 4, 2021

Bug is not handling metadata in your filename. You exploiting that.
Proper video file should not have metadata at all to be used with OpenCV (all versions).

@mastmees
Copy link

mastmees commented Sep 5, 2021

Very funny. So the autorotation feature that is solely based on video metadata is, in fact, improper use and exploitation of opencv?

@asmorkalov
Copy link
Contributor

The goal of OpenCV cv::VideoCapture is to play back video as it was originally filmed and played back with regular players. The rotation meta appears relatively recently and OpenCV just adapted the option, nothing else. Looking forward, all users what to get frames from camera as they filmed. The CAP_PROP_ORIENTATION_AUTO was introduced for compatibility and it's your case. OpenCV team will not change the default as it's non-rational for most of users in future. BTW: such options behavior may change on backend side (FFmpeg, Media Foundation, whatever). Also you can step back to older version of FFmpeg that does not support rotation meta and get the same behavior.

@mastmees
Copy link

mastmees commented Sep 6, 2021

The rotation metadata is added to videos on mobile phones that can be easily used in either landscape or portrait mode, and this metadata has to be used by video players that want to play back the video correctly oriented on non-mobile devices. The video frame itself is always recorded the same way, the orientation tells in what position the recording device was held during recording. When playing back on mobile device, the rotation metadata can basically be ignored, as the user can easily rotate the device to the same orientation that was used during recording. On computer monitors the video player has to rotate the video so that it is played back in correct orientation without rotating the physical screen. If OpenCV aims to be video player (and there was me, thinking that it is Computer Vision library), then rotating the video based on metadata is basically a right thing to do, I am not arguing against that. I am just saying that the way the change was implemented breaks existing code. If that is in dev teams view a necessary break then I would expect that users get big warnings about such cases in release notes, and clear instructions with examples how to control the feature for reverting back to the old behaviour.

In real life use across multiple platforms "stepping back to older version of FFmpeg" or any other package is not a viable long-term option. Meanwhile, I have patched my code just to check for opencv version, and if it is 4.5 or above I am assuming the frames are already rotated, but long-term I will probably be migrating to something that does not aim to be everything in one, plus video player.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
category: videoio effort: few days Extra design work may required (think about tests too). Or prepare a great tutorial. feature Hackathon https://opencv.org/opencv-hackathon-starts-next-week/
Projects
None yet
Development

No branches or pull requests

10 participants