Базовые операции OpenCV для C++
Базовые операции с изображениями
Чтение, отображение и сохранение изображений
В OpenCV базовые операции с изображениями включают чтение, отображение и сохранение изображений. Эти операции являются основой обработки изображений.
Чтение изображений: используйтеimreadфункцию для чтения изображения. Первый параметр этой функции — путь к файлу изображения, а второй параметр — способ чтения изображения (например, цветное изображение, изображение в оттенках серого и т. д.).
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
Отображение изображений: используйтеimshowфункцию для отображения изображения. Первый параметр этой функции — имя окна, а второй параметр — отображаемое изображение.
cv::imshow("Display Window", image);
cv::waitKey(0); // 等待按键按下
Сохранение изображений: используйтеimwriteфункцию для сохранения изображения. Первый параметр этой функции — путь к файлу для сохранения, а второй параметр — сохраняемое изображение.
cv::imwrite("output.jpg", image);
Базовые свойства изображений
Базовые свойства изображения включают размер, количество каналов и значения пикселей.
Размер: Размер изображения можно получить черезrowsиcolsатрибута.
int height = image.rows; int width = image.cols;
Количество каналов: Количество каналов изображения можно получить черезchannels()метод.
int channels = image.channels();
Значения пикселей: доступ к ним можно получить черезatметод для доступа к значениям пикселей изображения.
cv::Vec3b pixel = image.at<cv::Vec3b>(y, x); // 访问(x, y)处的像素值
Создание и инициализация изображений
Вы можете использоватьMatкласс для создания и инициализации изображений.
Создание изображений: Вы можете создать изображение заданного размера и типа.
cv::Mat newImage(480, 640, CV_8UC3, cv::Scalar(0, 0, 255)); // 创建一个640x480的红色图像
Инициализация изображений: ИспользуйтеsetToметод для инициализации изображения.
image.setTo(cv::Scalar(255, 255, 255)); // 将图像初始化为白色
Операции с пикселями изображений
Операции с пикселями изображения включают перебор пикселей и изменение значений пикселей.
Перебор пикселей: Вы можете использовать двойной цикл для перебора каждого пикселя изображения.
for (int y = 0; y < image.rows; y++) {
for (int x = 0; x < image.cols; x++) {
cv::Vec3b& pixel = image.at<cv::Vec3b>(y, x);
// 对像素进行操作
}
}
Изменение значений пикселей: Вы можете напрямую изменять значение пикселя.
pixel[0] = 255; // 将蓝色通道设置为255 pixel[1] = 0; // 将绿色通道设置为0 pixel[2] = 0; // 将红色通道设置为0
Геометрические преобразования изображений
Масштабирование, поворот, перенос и отражение
Геометрические преобразования изображения включают масштабирование, поворот, перенос и отражение.
Масштабирование: Используйтеresizeфункцию для масштабирования изображения.
cv::Mat resizedImage; cv::resize(image, resizedImage, cv::Size(newWidth, newHeight));
Поворот: ИспользуйтеgetRotationMatrix2DиwarpAffineфункцию для поворота изображения.
cv::Point2f center(image.cols / 2.0, image.rows / 2.0); cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0); cv::Mat rotatedImage; cv::warpAffine(image, rotatedImage, rotationMatrix, image.size());
Перенос: ИспользуйтеwarpAffineфункцию для переноса изображения.
cv::Mat translationMatrix = (cv::Mat_<double>(2, 3) << 1, 0, tx, 0, 1, ty); cv::Mat translatedImage; cv::warpAffine(image, translatedImage, translationMatrix, image.size());
Отражение: Используйтеflipфункцию для отражения изображения.
cv::Mat flippedImage; cv::flip(image, flippedImage, 1); // 1表示水平翻转,0表示垂直翻转
Аффинное преобразование и перспективное преобразование
Аффинное преобразование: Аффинное преобразование — это линейное преобразование плюс перенос, и его можно реализовать с помощьюwarpAffineфункцию.
cv::Mat affineMatrix = cv::getAffineTransform(srcPoints, dstPoints); cv::Mat affineImage; cv::warpAffine(image, affineImage, affineMatrix, image.size());
Перспективное преобразование: Перспективное преобразование — это более общее преобразование, и его можно реализовать с помощьюwarpPerspectiveфункцию.
cv::Mat perspectiveMatrix = cv::getPerspectiveTransform(srcPoints, dstPoints); cv::Mat perspectiveImage; cv::warpPerspective(image, perspectiveImage, perspectiveMatrix, image.size());
Преобразование цветового пространства изображений
Цветовые пространства, такие как RGB, оттенки серого и HSV
Цветовые пространства изображения включают RGB, оттенки серого, HSV и т. д.
- RGB: RGB — наиболее распространённое цветовое пространство, представляющее три канала: красный, зелёный и синий.
- Оттенки серого: Изображение в оттенках серого имеет только один канал, который представляет яркость.
- HSV: Цветовое пространство HSV представляет оттенок, насыщенность и значение.
Преобразование цветового пространства
ИспользуйтеcvtColorфункция для выполнения преобразования цветового пространства.
Преобразование RGB в оттенки серого:
cv::Mat grayImage; cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
Преобразование RGB в HSV:
cv::Mat hsvImage; cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);
Разделение и объединение каналов
Разделение каналов: Используйтеsplitфункцию для разделения каналов изображения.
std::vector<cv::Mat> channels; cv::split(image, channels);
Объединение каналов: Используйтеmergeфункцию для объединения нескольких каналов в одно изображение.
cv::Mat mergedImage; cv::merge(channels, mergedImage);
Примеры
Основные операции C++ OpenCV включают чтение изображений, отображение, сохранение, операции с пикселями, получение свойств изображения и т. д.
Ниже приведены некоторые распространённые базовые операции OpenCV и примеры их кода:
1. Чтение и отображение изображений
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
// Проверьте, успешно ли загружено изображение
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Отобразить изображение
namedWindow("Отобразить изображение", WINDOW_AUTOSIZE);
imshow("Отобразить изображение", image);
// Ожидание нажатия клавиши
waitKey(0);
// Закрыть окно
destroyAllWindows();
return 0;
}
2. Сохранение изображений
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Сохранить изображение
bool isSaved = imwrite("saved_image.jpg", image);
if (isSaved) {
cout << "Изображение успешно сохранено!" << endl;
} else {
cout << "Не удалось сохранить изображение!" << endl;
}
return 0;
}
3. Получение свойств изображения
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Получить свойства изображения
int width = image.cols; // Ширина изображения
int height = image.rows; // Высота изображения
int channels = image.channels(); // Количество каналов изображения
cout << "Ширина изображения: " << width << endl;
cout << "Высота изображения: " << height << endl;
cout << "Количество каналов изображения: " << channels << endl;
return 0;
}
4. Доступ к значениям пикселей и их изменение
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Доступ к значениям пикселей (формат BGR)
Vec3b pixel = image.at<Vec3b>(100, 100); // Получить значение пикселя в позиции (100, 100)
cout << "B: " << (int)pixel[0] << ", G: " << (int)pixel[1] << ", R: " << (int)pixel[2] << endl;
// Изменить значение пикселя
image.at<Vec3b>(100, 100) = Vec3b(255, 0, 0); // Установить пиксель в позиции (100, 100) в синий цвет
// Отобразить изменённое изображение
imshow("Изменённое изображение", image);
waitKey(0);
destroyAllWindows();
return 0;
}
5. Преобразование цветового пространства изображения
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Преобразовать в оттенки серого
Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);
// Отобразить изображение в оттенках серого
imshow("Изображение в оттенках серого", grayImage);
waitKey(0);
destroyAllWindows();
return 0;
}
6. Обрезка и масштабирование изображений
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Обрезать изображение
Rect roi(100, 100, 200, 200); // (x, y, ширина, высота)
Mat croppedImage = image(roi);
// Масштабировать изображение
Mat resizedImage;
resize(image, resizedImage, Size(400, 400)); // Масштабировать до 400x400
// Отобразить обрезанное и масштабированное изображение
imshow("Cropped Image", croppedImage);
imshow("Resized Image", resizedImage);
waitKey(0);
destroyAllWindows();
return 0;
}
7. Копирование и клонирование изображений
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Копировать изображение
Mat copiedImage = image.clone();
// Изменить скопированное изображение
circle(copiedImage, Point(100, 100), 50, Scalar(0, 255, 0), 2); // Нарисовать круг на скопированном изображении
// Отобразить исходное изображение и изменённое изображение
imshow("Исходное изображение", image);
imshow("Скопированное изображение", copiedImage);
waitKey(0);
destroyAllWindows();
return 0;
}
8. Геометрические преобразования изображений
Пример
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Прочитать изображение
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Ошибка: не удалось загрузить изображение, проверьте, правильный ли путь." << endl;
return -1;
}
// Повернуть изображение
Mat rotatedImage;
Point2f center(image.cols / 2, image.rows / 2); // Центр вращения
double angle = 45; // Угол поворота
double scale = 1.0; // Коэффициент масштабирования
Mat rotationMatrix = getRotationMatrix2D(center, angle, scale);
warpAffine(image, rotatedImage, rotationMatrix, image.size());
// Отобразить повернутое изображение
imshow("Повернутое изображение", rotatedImage);
waitKey(0);
destroyAllWindows();
return 0;
}