You Can Enable It Via 39;opencv_io_enable_openexr 39; Option

2 views
Skip to first unread message

Noah Casanova

unread,
Aug 5, 2024, 9:47:53 AM8/5/24
to thegavical
Ifyou have previous/other manually installed (= not installed via pip) version of OpenCV installed (e.g. cv2 module in the root of Python's site-packages), remove it before installation to avoid conflicts.

Make sure that your pip version is up-to-date (19.3 is the minimum supported version): pip install --upgrade pip. Check version with pip -V. For example Linux distributions ship usually with very old pip versions which cause a lot of unexpected problems especially with the manylinux format.


There are four different packages (see options 1, 2, 3 and 4 below) and you should SELECT ONLY ONE OF THEM. Do not install multiple different packages in the same environment. There is no plugin architecture: all the packages use the same namespace (cv2). If you installed multiple different packages in the same environment, uninstall them all with pip uninstall and reinstall only one package.


These packages are smaller than the two other packages above because they do not contain any GUI functionality (not compiled with Qt / other GUI components). This means that the packages avoid a heavy dependency chain to X11 libraries and you will have for example smaller Docker images as a result. You should always use these packages if you do not use cv2.imshow et al. or you are using some other package (such as PyQt) than OpenCV to create your GUI.


Since opencv-python version 4.3.0.*, manylinux1 wheels were replaced by manylinux2014 wheels. If your pip is too old, it will try to use the new source distribution introduced in 4.3.0.38 to manually build OpenCV because it does not know how to install manylinux2014 wheels. However, source build will also fail because of too old pip because it does not understand build dependencies in pyproject.toml. To use the new manylinux2014 pre-built wheels (or to build from source), your pip version must be >= 19.3. Please upgrade pip with pip install --upgrade pip.


A: If the import fails on Windows, make sure you have Visual C++ redistributable 2015 installed. If you are using older Windows version than Windows 10 and latest system updates are not installed, Universal C Runtime might be also required.


If you have Windows Server 2012+, media DLLs are probably missing too; please install the Feature called "Media Foundation" in the Server Manager. Beware, some posts advise to install "Windows Server Essentials Media Pack", but this one requires the "Windows Server Essentials Experience" role, and this role will deeply affect your Windows Server configuration (by enforcing active directory integration etc.); so just installing the "Media Foundation" should be a safer choice.


If you still encounter the error after you have checked all the previous solutions, download Dependencies and open the cv2.pyd (located usually at C:\Users\username\AppData\Local\Programs\Python\PythonXX\Lib\site-packages\cv2) file with it to debug missing DLL issues.


A: The repository contains only OpenCV-Python package build scripts, but not OpenCV itself. Python bindings for OpenCV are developed in official OpenCV repository and it's the best place to report issues. Also please check OpenCV wiki and the official OpenCV forum before file new bugs.


A: Non-free algorithms such as SURF are not included in these packages because they are patented / non-free and therefore cannot be distributed as built binaries. Note that SIFT is included in the builds due to patent expiration since OpenCV versions 4.3.0 and 3.4.10. See this issue for more info: -python/issues/126


A: It's easier for users to understand opencv-python than cv2 and it makes it easier to find the package with search engines. cv2 (old interface in old OpenCV versions was named as cv) is the name that OpenCV developers chose when they created the binding generators. This is kept as the import name to be consistent with different kind of tutorials around the internet. Changing the import name or behaviour would be also confusing to experienced users who are accustomed to the import cv2.


The project is structured like a normal Python package with a standard setup.py file.The build process for a single entry in the build matrices is as follows (see for example .github/workflows/build_wheels_linux.yml file):


Since OpenCV version 4.3.0, also source distributions are provided in PyPI. This means that if your system is not compatible with any of the wheels in PyPI, pip will attempt to build OpenCV from sources. If you need a OpenCV version which is not available in PyPI as a source distribution, please follow the manual build guidance above instead of this one.


If you need contrib modules or headless version, just change the package name (step 4 in the previous section is not needed). However, any additional CMake flags can be provided via environment variables as described in step 3 of the manual build section. If none are provided, OpenCV's CMake scripts will attempt to find and enable any suitable dependencies. Headless distributions have hard coded CMake flags which disable all possible GUI dependencies.


find_version.py script searches for the version information from OpenCV sources and appends also a revision number specific to this repository to the version string. It saves the version information to version.py file under cv2 in addition to some other flags.


A release is made and uploaded to PyPI when a new tag is pushed to master branch. These tags differentiate packages (this repo might have modifications but OpenCV version stays same) and should be incremented sequentially. In practice, release version numbers look like this:


Linux wheels are built using manylinux2014. These wheels should work out of the box for most of the distros (which use GNU C standard library) out there since they are built against an old version of glibc.


In an OpenEXR file, pixel data can be stored either as scan lines or astiles. Files that store pixels as tiles can also store multi-resolutionimages. For each of the two storage formats (scan line or tile-based),the OpenEXR library supports two reading and writing interfaces:


The classes for reading scan line based images (InputFile andRgbaInputFile) can also be used to read tiled image files. This way,programs that do not need support for tiled or multi-resolution imagescan always use the rather straightforward scan line interfaces, withoutworrying about complications related to tiling and multiple resolutions.When a multi-resolution file is read via a scan line interface, only thehighest-resolution version of the image is accessible.


Multi-part files support multipleindependent parts. This allowsstoring multiple views in the samefile for stereo images, storingmultiple resolutions in differentparts. It is possible to includeone or more scan line, tile, deepscan line or deep tile formatimages within a multi-part file.


Line 5 specifies how the pixel data are laid out in memory. In ourexample, the pixels pointer is assumed to point to the beginning of anarray of width*height pixels. The pixels are represented as Rgbastructs, which are defined like this:


The elements of our array are arranged so that the pixels of each scanline are contiguous in memory. The setFrameBuffer() function takesthree arguments, base, xStride, and ystride. To find the addressof pixel (x,y), the RgbaOutputFile object computes


You may have noticed that in the example above, there are no explicitchecks to verify that writing the file actually succeeded. If the OpenEXRlibrary detects an error, it throws a C++ exception instead of returninga C-style error code. With exceptions, error handling tends to be easierto get right than with error return values. For instance, a program thatcalls our writeRgba1() function can handle all possible errorconditions with a single try/catch block:


Even though we are storing only part of the image in the file, the framebuffer is still large enough to hold the whole image. In order to savememory, a smaller frame buffer could have been allocated, just bigenough to hold the contents of the data window. Assuming that the pixelswere still stored in contiguous scan lines, with the pixels pointerpointing to the pixel at the upper left corner of the data window, atcoordinates (dataWindow.min.x, dataWindow.min.y), the arguments to thesetFrameBuffer() call would have to be to be changed as follows:


The setFrameBuffer() and writePixels() calls are the same as in theprevious examples, but construction of the RgbaOutputFile object isdifferent. The constructors in the previous examples automaticallycreated a header on the fly, and immediately stored it in the file. Herewe explicitly create a header and add our own attributes to it. When wecreate the RgbaOutputFile object, we tell the constructor to use ourheader instead of creating its own.


Note that we ignore the display window in this example; in a programthat wanted to place the pixels in the data window correctly in anoverall image, the display window would have to be taken into account.


Calling readPixels() copies the pixel data from the file into thebuffer. If one or more of the R, G, B, and A channelsare missing in the file, the corresponding field in the pixels isfilled with an appropriate default value. The default value for R,G and B is 0.0, or black; the default value for A is 1.0,or opaque.


Unlike the RgbaOutputFile's writePixels() method,readPixels() has two arguments. Calling readPixels(y1,y2)copies the pixels for all scan lines with y coordinates from y1 toy2 into the frame buffer. This allows access to the the scanlines in any order. The image can be read all at once, one scan lineat a time, or in small blocks of a few scan lines. It is also possibleto skip parts of the image.


Again, we open the file and read the file header by constructing anRgbaInputFile object. Then we allocate a memory buffer that isjust large enough to hold ten complete scan lines. We callreadPixels() to copy the pixels from the file into our buffer, tenscan lines at a time. Since we want to re-use the buffer for everyblock of ten scan lines, we have to call setFramebuffer() beforeeach readPixels() call, in order to associate memory address&pixels[0][0] first with pixel coordinates (dw.min.x,dw.min.y), then with (dw.min.x, dw.min.y+10), (dw.min.x,dw.min.y+20) and so on.

3a8082e126
Reply all
Reply to author
Forward
0 new messages