Opencv в python. часть 3
Содержание:
- Как рассчитать гомографию?
- OpenCV-Python
- NuGet
- Project details
- Importing annotations from other platforms or open-source tools
- параметр
- Release highlights
- Convex Hull
- Загрузка, отображение и сохранение изображения
- Contributors
- Our test case
- Приложения гомографии
- Изменение размера изображения
- Преобразование изображений
- Разбиение и слияние каналов
- Features of OpenCV Library
Как рассчитать гомографию?
Посмотрим код.
''' pts_src и pts_dst - это массивы точек в исходных и конечных изображениях. Нам нужно как минимум 4 соответствующих пункта. ''' h, status = cv2.findHomography(pts_src, pts_dst) ''' Рассчитанная гомография может быть использована для деформации исходного изображения до места назначения. Размер размер (ширина, высота) im_dst ''' im_dst = cv2.warpPerspective(im_src, h, size)
Пример гомографии с OpenCV на Python
Изображения на рисунке 2 созданы с использованием следующего кода Python, где используются четыре точки соответствия на двух изображениях и одно изображение трансформируется в другое.
import cv2 import numpy as np if __name__ == '__main__' : # Прочитайте исходное изображение. im_src = cv2.imread('book2.jpg') # Четыре точки соответствия на обложке книги в исходном изображении pts_src = np.array(, , , ]) # Прочитайте изображение для трансформации im_dst = cv2.imread('book1.jpg') # Четыре точки соответствия на обложке книги в изображении трансформации pts_dst = np.array(,,, ]) # Рассчитайте гомографию h, status = cv2.findHomography(pts_src, pts_dst) # Трансформируем исходное изображение, используя полученную гомографию im_out = cv2.warpPerspective(im_src, h, (im_dst.shape,im_dst.shape)) # Покажите картинки cv2.imshow("Source Image", im_src) cv2.imshow("Destination Image", im_dst) cv2.imshow("Warped Source Image", im_out) cv2.waitKey(0)
OpenCV-Python
OpenCV-Python is a library of Python bindings designed to solve computer vision problems.
Python is a general purpose programming language started by Guido van Rossum that became very popular very quickly, mainly because of its simplicity and code readability. It enables the programmer to express ideas in fewer lines of code without reducing readability.
Compared to languages like C/C++, Python is slower. That said, Python can be easily extended with C/C++, which allows us to write computationally intensive code in C/C++ and create Python wrappers that can be used as Python modules. This gives us two advantages: first, the code is as fast as the original C/C++ code (since it is the actual C++ code working in background) and second, it easier to code in Python than C/C++. OpenCV-Python is a Python wrapper for the original OpenCV C++ implementation.
OpenCV-Python makes use of Numpy, which is a highly optimized library for numerical operations with a MATLAB-style syntax. All the OpenCV array structures are converted to and from Numpy arrays. This also makes it easier to integrate with other libraries that use Numpy such as SciPy and Matplotlib.
NuGet
| Package | Description | Link |
|---|---|---|
| OpenCvSharp4 | OpenCvSharp core libraries | |
| OpenCvSharp4.WpfExtensions | WPF Extensions | |
| OpenCvSharp4.Windows | All-in-one package for Windows (except UWP) | |
| OpenCvSharp4.runtime.win | Native bindings for Windows x64/x86 (except UWP) | |
| OpenCvSharp4.runtime.uwp | Native bindings for UWP (Universal Windows Platform) x64/x86/ARM | |
| OpenCvSharp4.runtime.ubuntu.18.04-x64 | Native bindings for Ubuntu 18.04 x64 | |
| OpenCvSharp4.runtime.osx.10.15-x64 | Native bindings for macOS 10.15 x64 | |
| OpenCvSharp4.runtime.linux-arm | Native bindings for Linux Arm |
Native binding (OpenCvSharpExtern.dll / libOpenCvSharpExtern.so) is required to work OpenCvSharp. To use OpenCvSharp, you should add both and packages to your project. Currently, native bindings for Windows, UWP, Ubuntu 18.04 and macOS are released.
Packages named OpenCvSharp3-* and OpenCvSharp-* are deprecated.
Project details
Homepage
License: MIT License (MIT)
Maintainer: Olli-Pekka Heinisuo
Requires: Python >=3.6
Classifiers
-
Development Status
5 — Production/Stable
-
Environment
Console
-
Intended Audience
-
Developers
-
Education
-
Information Technology
-
Science/Research
-
-
License
OSI Approved :: MIT License
-
Operating System
-
MacOS
-
Microsoft :: Windows
-
POSIX
-
Unix
-
-
Programming Language
-
C++
-
Python
-
Python :: 3
-
Python :: 3 :: Only
-
Python :: 3.6
-
Python :: 3.7
-
Python :: 3.8
-
Python :: 3.9
-
Python :: Implementation :: CPython
-
-
Topic
-
Scientific/Engineering
-
Scientific/Engineering :: Image Recognition
-
Software Development
-
Importing annotations from other platforms or open-source tools
Migrating to SuperAnnotate from other software is something important to our customers. This was a common request from our users as many of them wanted to use our platform to quality check their previous work and transition over from other tools. We’ve made it super easy to import annotated data from other annotation tools using only a few lines of code, which I’ve described below. Then, once in our platform, users can leverage features described above like filtering and advanced polygon editing to easily perform QA on previous annotation work and check prediction accuracy.
To see how easy it is to migrate previous annotations, I have included the full code required.. (Note that you can transfer your annotations not only from other open-source tools but also from other paid platforms.) For the conversion, you can use our SDK where we provide all the conversion scripts to make an easy transition. Below is an example from Labelbox, but it can be applied to other platforms such as Amazon SageMaker, Google Cloud AutoML, Scale AI, VOTT, etc.
First, install the SDK and the supplementary repositories:
The use the script below to convert your data to SuperAnnotate format:
Once you receive the converted json file in SuperAnnotate format, you can simply upload annotations in our editor.

If you are interested in our premium features, you can bring the images and clean the annotations in our web-based platform, then automate the annotation of the next set of images using transfer learning. Please refer to this article and learn how to do it without writing a single line of code.
параметр
Первый параметр — найти контурное изображение;
Второй параметр указывает режим извлечения схемы, существует четыре типа (в этой статье представлен новый интерфейс cv2): cv2.RETR_EXTERNAL означает, что обнаружен только внешний контур cv2.RETR_LIST обнаруженные контуры не устанавливают иерархические отношения cv2.RETR_CCOMP устанавливает два уровня контура, верхний уровень — это внешняя граница, а внутренний уровень — информация о границе внутреннего отверстия. Если во внутреннем отверстии есть связанный объект, граница этого объекта также находится на верхнем слое. cv2.RETR_TREE устанавливает схему иерархической древовидной структуры.
Третий параметр метода — приближенный метод контура ** cv2.CHAIN_APPROX_NONE хранит все точки контура, разность положения пикселей между двумя соседними точками не превышает 1 **, то есть max (abs (x1-x2), abs (y2) -Y1)) == 1 cv2.CHAIN_APPROX_SIMPLE сжимает элементы в горизонтальном, вертикальном и диагональном направлениях и сохраняет только координаты конечной точки направления. Например, прямоугольному контуру требуется только 4 точки для сохранения информации о контуре cv2.CHAIN_APPROX_TC89_L1, CV_CHAIN_APPROX_TC89_KCOS использует алгоритм приближения цепочки Те-Чинля
Release highlights
- Integrated more GSoC 2020 results including improvements in OpenCV.js, optimizations of SIFT and extra DNN samples
- Improvements in dnn module:
- optimized and fixed several layers in default and CUDA backends
- supported OpenVINO 2021.2 release and HDDL backend
- Improvements in gapi module:
- Integration with TBB for multithreaded graph processing
- Further integration with Inference Engine (OpenVINO), ONNX runtime and media libraries opens way for building complete video-processing pipelines using only G-API
- Added new operations including morphologyEx, kmeans, Background subtractor and Kalman filter
- Significant improvements in RISC-V universal intrinsics backend have been contributed by Institute of Software, Chinese Academy of Sciences
More details can be found in the .
Most of bugfixes and improvements have made their way to both 3.4 and master branches.
Convex Hull
Convex Hull will look similar to contour approximation, but it is not (Both may provide same results in some cases). Here, function checks a curve for convexity defects and corrects it. Generally speaking, convex curves are the curves which are always bulged out, or at-least flat. And if it is bulged inside, it is called convexity defects. For example, check the below image of hand. Red line shows the convex hull of hand. The double-sided arrow marks shows the convexity defects, which are the local maximum deviations of hull from contours.
image
There is a little bit things to discuss about it its syntax:
hull = (points]])
Arguments details:
- points are the contours we pass into.
- hull is the output, normally we avoid it.
- clockwise : Orientation flag. If it is True, the output convex hull is oriented clockwise. Otherwise, it is oriented counter-clockwise.
- returnPoints : By default, True. Then it returns the coordinates of the hull points. If False, it returns the indices of contour points corresponding to the hull points.
So to get a convex hull as in above image, following is sufficient:
hull = (cnt)
But if you want to find convexity defects, you need to pass returnPoints = False. To understand it, we will take the rectangle image above. First I found its contour as cnt. Now I found its convex hull with returnPoints = True, I got following values: which are the four corner points of rectangle. Now if do the same with returnPoints = False, I get following result: ,,,]. These are the indices of corresponding points in contours. For eg, check the first value: cnt = ] which is same as first result (and so on for others).
You will see it again when we discuss about convexity defects.
Загрузка, отображение и сохранение изображения
Для загрузки изображения мы используем функцию cv2.imread(), где первым аргументом указывается путь к изображению, а вторым аргументом, который является необязательным, мы указываем, в каком цветовом пространстве мы хотим считать наше изображение. Чтобы считать изображение в RGB — cv2.IMREAD_COLOR, в оттенках серого — cv2.IMREAD_GRAYSCALE. По умолчанию данный аргумент принимает значение cv2.IMREAD_COLOR. Данная функция возвращает 2D (для изображения в оттенках серого) либо 3D (для цветного изображения) массив NumPy. Форма массива для цветного изображения: высота x ширина x 3, где 3 — это байты, по одному байту на каждую из компонент. В изображениях в оттенках серого всё немного проще: высота x ширина.
С помощью функции cv2.imshow() мы отображаем изображение на нашем экране. В качестве первого аргумента мы передаём функции название нашего окна, а вторым аргументом изображение, которое мы загрузили с диска, однако, если мы далее не укажем функцию cv2.waitKey(), то изображение моментально закроется. Данная функция останавливает выполнение программы до нажатия клавиши, которую нужно передать первым аргументом. Для того, чтобы любая клавиша была засчитана передаётся 0. Слева представлено изображение в оттенках серого, а справа в формате RGB:

И, наконец, с помощью функции cv2.imwrite() записываем изображение в файл в формате jpg(данная библиотека поддерживает все популярные форматы изображений:png, tiff,jpeg,bmp и т. д., поэтому можно было сохранить наше изображение в любом из этих форматов), где первым аргументом передаётся непосредственно само название и расширение, а следующим параметром изображение, которое мы хотим сохранить.
Contributors
Big thanks to everybody who contributed (here is the incomplete list of patch authors; please report if you contributed but do not see your name here):
opencv
Alexander Alekhin, Anatoliy Talamanov, Ruslan Garnov, Dmitry Matveev, Maksim Shabunin, Orest Chura, Jonathan Cole, Sergei Slashchinin, Anna Khakimova, Anton Potapov, Giles Payne, Igor Murzov, Maxim Pashchenkov, Vincent Rabaud, Alexander Smorkalov, Anastasia Murzova, Dale Phurrough, Ian Maquignaz, Liubov Batanina, Aitik Gupta, Anastasiya Pronina, Chris Ballinger, OrestChura, Quentin Chateau, Roman Kazantsev, Sergey Slashchinin, Steffen Urban, Welton Rodrigo Torres Nascimento, catree, mtfrctl, APrigarina, Alexey Smirnov, Andreas Franek, Anton Veselskyi, AsyaPronina, Christos Malliaridis, Clement Courbet, Daniel Cauchi, Daniel Motilla, Dmitry Budnikov, Felix Gorschlüter, Francesco Petrogalli, Gabriel Nascarella Hishida, Hollow Man, Jack·Boos·Yu, Jaime Rivera, Jiri Kucera, Joe, Jojo R, Jose Quaresma, Julien, Justin Frank, Kong Liangqian, Krushnal Patel, Kun Liang, Mark Shachkov, Martin Štefaňák, Michael Gruner, Mikkel Green, Nathan Godwin, Nikolai, Omar Alzaibaq, Or Avital, Pavel Grunt, Pavel Rojtberg, Randall Britten, Rob Timpe, Suleyman TURKMEN, Vadim Levin, Vadim Pisarevsky, Wenqing Zhang, YashasSamaga, Yiming Li, Yosshi999, ZhangYin, Zhangyin, Zhiming-Zeng, Zhiyuan Chen, ann, arodrigu, berak, chargerKong, joshdoe, junxnone, lizz, masa-iwm, maxint, shioko
opencv_contrib
Alexander Alekhin, DumDereDum, Akash Sharma, Enrico Ronconi, EricFlorin, Iago Suárez, Igor Murzov, Kong Liangqian, Kumataro, Matthias Berberich, Paul Jurczak, Rob Timpe, Shingo Otsuka, Steffen Urban, TT, Vincent Rabaud, Yuriy Obukh, Zhiju Cen, crownedone, cudawarped, riskiest, sunitanyk, unknown
Our test case
Let us consider a simple color reduction method. By using the unsigned char C and C++ type for matrix item storing, a channel of pixel may have up to 256 different values. For a three channel image this can allow the formation of way too many colors (16 million to be exact). Working with so many color shades may give a heavy blow to our algorithm performance. However, sometimes it is enough to work with a lot less of them to get the same final result.
In this cases it’s common that we make a color space reduction. This means that we divide the color space current value with a new input value to end up with fewer colors. For instance every value between zero and nine takes the new value zero, every value between ten and nineteen the value ten and so on.
When you divide an uchar (unsigned char — aka values between zero and 255) value with an int value the result will be also char. These values may only be char values. Therefore, any fraction will be rounded down. Taking advantage of this fact the upper operation in the uchar domain may be expressed as:
A simple color space reduction algorithm would consist of just passing through every pixel of an image matrix and applying this formula. It’s worth noting that we do a divide and a multiplication operation. These operations are bloody expensive for a system. If possible it’s worth avoiding them by using cheaper operations such as a few subtractions, addition or in best case a simple assignment. Furthermore, note that we only have a limited number of input values for the upper operation. In case of the uchar system this is 256 to be exact.
Therefore, for larger images it would be wise to calculate all possible values beforehand and during the assignment just make the assignment, by using a lookup table. Lookup tables are simple arrays (having one or more dimensions) that for a given input value variation holds the final output value. Its strength is that we do not need to make the calculation, we just need to read the result.
Our test case program (and the code sample below) will do the following: read in an image passed as a command line argument (it may be either color or grayscale) and apply the reduction with the given command line argument integer value. In OpenCV, at the moment there are three major ways of going through an image pixel by pixel. To make things a little more interesting we’ll make the scanning of the image using each of these methods, and print out how long it took.
You can download the full source code here or look it up in the samples directory of OpenCV at the cpp tutorial code for the core section. Its basic usage is:
how_to_scan_images imageName.jpg intValueToReduce
The final argument is optional. If given the image will be loaded in grayscale format, otherwise the BGR color space is used. The first thing is to calculate the lookup table.
int divideWith = 0;
stringstream s;
s << argv;
s >> divideWith;
if (!s || !divideWith)
{
cout << «Invalid number entered for dividing. » << endl;
return -1;
}
table;
for (int i = 0; i < 256; ++i)
table = ()(divideWith * (i/divideWith));
Here we first use the C++ stringstream class to convert the third command line argument from text to an integer format. Then we use a simple look and the upper formula to calculate the lookup table. No OpenCV specific stuff here.
Another issue is how do we measure time? Well OpenCV offers two simple functions to achieve this and . The first returns the number of ticks of your systems CPU from a certain event (like since you booted your system). The second returns how many times your CPU emits a tick during a second. So, measuring amount of time elapsed between two operations is as easy as:
double t = (double)();
t = ((double)() — t)/();
cout << «Times passed in seconds: » << t << endl;
Приложения гомографии
Самым интересным применением гомографии, несомненно, является создание панорам, например, мозаика и сшивание изображений. О панорамах по-позже. Посмотрим на некоторые другие интересные приложения.
Коррекция перспективы с помощью гомографии
Рисунок 3. Коррекция перспективы
Допустим, у вас есть фотография, показанная на рисунке 1. Не было бы здорово, если бы вы могли щелкнуть по четырем углам книги и быстро получить изображение, похожее на изображение, показанное на рисунке 3. Вы можете получить код для этого пример в ниже. Вот шаги.
- Напишите пользовательский интерфейс для сбора четырех углов книги. Давайте подсчитаем эти баллы pts_src
- Нам нужно знать соотношение сторон книги. Для этой книги соотношение сторон (ширина/высота) составляет 3/4. Таким образом, мы можем выбрать размер выходного изображения 300 × 400, а наши конечные точки (pts_dst) равны (0,0), (299,0), (299,399) и (0,399)
- Получите гомографию, используя pts_src и pts_dst.
- Примените гомографию к исходному изображению, чтобы получить изображение на рисунке 3.
Виртуальный билборд
На многих телевизионных спортивных мероприятиях реклама практически вставляется в прямую трансляцию видео. Например. в футболе и бейсболе реклама, размещенная на небольших рекламных щитах прямо за границей поля, может быть практически изменена. Вместо того, чтобы показывать одно и то же объявление всем, рекламодатели могут выбирать, какие объявления показывать, исходя из демографических данных, местоположения и т. Д. В этих приложениях в ролике обнаруживаются четыре угла рекламного щита, которые служат точками назначения. Четыре угла объявления служат исходными точками. Гомография рассчитывается на основе этих четырех соответствующих точек и используется для деформации рекламы в видеокадр.
Прочитав этот пост, вы, вероятно, получите представление о том, как разместить изображение на виртуальном рекламном щите. Рисунок 4. показывает Исходное изображение, загруженное из интернета.
Рисунок 4. Исходное изображение, загруженное из интернета
А на рисунке 5 показан Таймс-сквер.
Рисунок 5. Таймс-сквер
Мы можем заменить один из рекламных щитов на Таймс-сквер нужным нам изображением. Вот шаги.
- Напишите пользовательский интерфейс для сбора четырех углов рекламного щита на изображении. Давайте назовем эти точки pts_dst
- Пусть размер изображения, которое вы хотите поместить на виртуальный рекламный щит, будет равен w x h. Поэтому углы изображения (pts_src) должны быть (0,0), (w-1,0), (w-1, h-1) и (0, h-1)
- Получите гомографию, используя pts_src и pts_dst.
- Примените гомографию к исходному изображению и смешайте его с целевым изображением, чтобы получить изображение на рисунке 6.
Обратите внимание на рисунок 6, где в изображение на Таймс-сквер мы вставили изображение, показанное на рисунке 4. Рисунок 6
Виртуальный рекламный щит. Один из рекламных щитов на левой стороне был заменен нужным нам изображением
Рисунок 6. Виртуальный рекламный щит. Один из рекламных щитов на левой стороне был заменен нужным нам изображением
Кредиты изображений
- Изображение на рисунке 4. было первым фотографическим изображением, загруженным в Интернет. Это квалифицируется как добросовестное использование. []
- Изображение, использованное на рисунке 5. (Квадрат времени), лицензировано в рамках GFDL.
По мотивам
Изменение размера изображения
Первый метод, который мы изучим — это как поменять высоту и ширину у изображения. Для этого в opencv есть такая функция как resize():
Данная функция первым аргументом принимает изображение, размер которого мы хотим изменить, вторым — кортеж, который должен содержать в себе ширину и высоту для нового изображения, третьим — метод интерполяции(необязательный). Интерполяция — это алгоритм, который находит неизвестные промежуточные значения по имеющемуся набору известных значений. Фактически, это то, как будут заполняться новые пиксели при модификации размера изображения. К примеру, интерполяция методом ближайшего соседа (cv2.INTER_NEAREST) просто берёт для каждого пикселя итогового изображения один пиксель исходного, который наиболее близкий к его положению — это самый простой и быстрый способ. Кроме этого метода в opencv существуют следующие: cv2.INTER_AREA, cv2.INTER_LINEAR( используется по умолчанию), cv2.INTER_CUBIC и cv2.INTER_LANCZOS4. Наиболее предпочтительным методом интерполяции для сжатия изображения является cv2.INTER_AREA, для увелечения — cv2.INTER_LINEAR
От данного метода зависит качество конечного изображения, но как показывает практика, если мы уменьшаем/увеличиваем изображение меньше, чем в 1.5 раза, то не важно каким методом интерполяции мы воспользовались — качество будет схожим. Данное утверждение можно проверить на практике
Напишем следующий код:
Слева — изображение с интерполяцией методом ближайшего соседа, справа — изображение с билинейной интерполяцией:

Очень важно при изменении размера изображения учитывать соотношение сторон. Соотношение сторон — это пропорциональное соотношение ширины и высоты изображения.Если мы забудем о данном понятии, то получим изображение такого плана:

Поэтому текущую функцию для изменения размера необходимо модифицировать:
Соотношение сторон мы вычисляем в переменной ratio. В зависимости от того, какой параметр не равен None, мы берём установленную нами новую высоту/ширину и делим на старую высоту/ширину. Далее, в переменной dimension мы определяем новые размеры изображения и передаём в функцию cv2.resize().
Преобразование изображений
Последней, но одной из самых важных тем, поднятых нами в данном обзоре библиотеки OpenCV, является преобразование изображений. Эта тема находит применение в самых разных приложениях, но отдельно следует упомянуть задачу аугментации данных для моделей машинного обучения. Речь идет о ситуациях, когда в нашем датасете для полноценного обучения недостаточно данных, и мы, дополняя и видоизменяя существующие картинки, увеличиваем первоначальный датасет до нужного размера. Это помогает нам серьезно увеличить точность работы обучаемой модели.
Список возможных преобразований весьма велик и включает в себя масштабирование, афинное преобразование изображений, вращение, транспонирование и многое другое. Мы кратко расскажем только про масштабирование и вращение, но в библиотеке OpenСV есть поддержка всех возможных преобразований. Начнем с масштабирования.
Масштабирование
Попросту говоря, масштабирование — это не что иное как изменение размеров изображения, его увеличение либо уменьшение. В библиотеке OpenCV для этого существует функция resize. У этой функции, в свою очередь, есть три метода: , и . Давайте на примере конкретного кода разберем, как это все работает. Пожалуйста, внимательно изучите код, комментарии к нему и описание ниже.
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('my_bike.jpg')
# Увеличиваем масштаб/расширяем в 2 раза по ширине и высоте
result_1 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# Уменьшаем масштаб/сжимаем в 2 раза по ширине и высоте
result_2 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_AREA)
# Выводим на экран получившиеся изображения
plt.imshow(result_1)
plt.imshow(result_2)
plt.show()
Здесь в функции параметр определяет масштаб изменений по ширине, — по высоте, а параметр отвечает за сам способ изменений (то есть расширение или сжатие).
Вращение
Вращение позволяет нам перемещать изображение вокруг определенной оси на заданный угол.
Перед тем как мы научимся вращать наши изображения при помощи библиотеки OpenСV, давайте вспомним, что существует линейный оператор под названием матрица поворота, который как раз и осуществляет преобразования такого рода. Мы не будем вдаваться в математические детали, так как в библиотеке OpenCV эта матрица вычисляется при помощи одного вызова функции. Вы это увидите в следующем коде:
import cv2
import matplotlib.pyplot as plt
# Загружаем изображение велосипеда
image = cv2.imread('my_bike.jpg',0)
# ряды и колонки
r, c = image.shape
matrix = cv2.getRotationMatrix2D((cols/2,rows/2), 180, 1)
result = cv2.warpAffine(image,matrix,(c,r))
# Выводим на экран повернутое изображение
plt.imshow(result)
plt.show()
В функции — это угол, на который наше изображение должно быть повернуто, — это масштабный коэффициент. Данная функция возвращает матрицу поворота, которая записывается в переменную .
Далее функция , используя вычисленную на предыдущем шаге матрицу поворота, поворачивает наше изображение в соответствии с заданной спецификацией.
Разбиение и слияние каналов
Как мы знаем, RGB изображение состоит из красной, зелёной и синих компонент. И что, если мы захотим разделить изображение на соответствующие компоненты? Для этого в opencv есть специальная функция — split():
Сначала мы загружаем изображение. Для наглядности работы данной функции я взял следующее изображение:

Затем разделяем изображение на три канала и показываем каждый канал по отдельности. В результате выполнения данной функции отобразится три изображения в оттенках серого:

Как мы видим, для каждого изображения каждого канала только прямоугольник с тем же цветом отображается белым. Вот как будет выглядеть каждая компонента для девушки из предыдущих частей:

Как можно увидеть, красный канал очень светлый. Это происходит потому, что оттенки красного очень сильно представлены в нашем изображении. Синий и зелёный каналы, наоборот, очень тёмные. Это случается потому, что на данном изображении очень мало данных цветов.
Для того, чтобы объединить каналы воедино, достаточно воспользоваться функцией merge(), которая принимает значения каналов:

Таким образом, мы получаем такое же изображение как оригинальное, за исключением того, что я поменял местами синий с зелёным каналом.
Features of OpenCV Library
Using OpenCV library, you can −
-
Read and write images
-
Capture and save videos
-
Process images (filter, transform)
-
Perform feature detection
-
Detect specific objects such as faces, eyes, cars, in the videos or images.
-
Analyze the video, i.e., estimate the motion in it, subtract the background, and track objects in it.
OpenCV was originally developed in C++. In addition to it, Python and Java bindings were provided. OpenCV runs on various Operating Systems such as windows, Linux, OSx, FreeBSD, Net BSD, Open BSD, etc.
This tutorial explains the concepts of OpenCV with examples using Java bindings.
