C++ OpenCV Operaciones básicas

Operaciones básicas de imágenes

Leer, mostrar y guardar imágenes

En OpenCV, las operaciones básicas de imágenes incluyen leer, mostrar y guardar imágenes. Estas operaciones son la base del procesamiento de imágenes.

Leer imagen: usarimreadla función para leer la imagen. El primer parámetro de esta función es la ruta del archivo de imagen, el segundo parámetro es la forma de leer la imagen (como imagen en color, imagen en escala de grises, etc.).

cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);

Mostrar imagen: usarimshowla función para mostrar la imagen. El primer parámetro de esta función es el nombre de la ventana, y el segundo parámetro es la imagen a mostrar.

cv::imshow("Display Window", image);
cv::waitKey(0); // 等待按键按下
Guardar imagen: usarimwritela función para guardar la imagen. El primer parámetro de esta función es la ruta del archivo a guardar, y el segundo parámetro es la imagen a guardar.
cv::imwrite("output.jpg", image);

Propiedades básicas de las imágenes

Las propiedades básicas de una imagen incluyen el tamaño, el número de canales y el valor de píxel.

Tamaño: El tamaño de la imagen se puederowsycolsobtener mediante la propiedad.

int height = image.rows;
int width = image.cols;

Número de canales: El número de canales de la imagen se puedechannels()obtener mediante el método.

int channels = image.channels();

Valor de píxel: Se puedeatacceder a los valores de píxel de la imagen mediante el método.

cv::Vec3b pixel = image.at<cv::Vec3b>(y, x); // 访问(x, y)处的像素值

Creación e inicialización de imágenes

Se puedeMatcrear e inicializar una imagen mediante la clase.

Crear imagen: Se puede crear una imagen de tamaño y tipo especificados.

cv::Mat newImage(480, 640, CV_8UC3, cv::Scalar(0, 0, 255)); // 创建一个640x480的红色图像

Inicializar imagen: Se puede usarsetToel método para inicializar la imagen.

image.setTo(cv::Scalar(255, 255, 255)); // 将图像初始化为白色

Operaciones de píxeles en imágenes

Las operaciones de píxeles en imágenes incluyen recorrer píxeles y modificar valores de píxeles.

Recorrer píxeles: Se puede usar un bucle doble para recorrer cada píxel de la imagen.

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);
        // 对像素进行操作
    }
}

Modificar valores de píxeles: Se puede modificar directamente el valor del píxel.

pixel[0] = 255; // 将蓝色通道设置为255
pixel[1] = 0;   // 将绿色通道设置为0
pixel[2] = 0;   // 将红色通道设置为0

Transformaciones geométricas de imágenes

Escalado, rotación, traslación, volteo

Las transformaciones geométricas de imágenes incluyen escalado, rotación, traslación y volteo.

Escalado: usarresizela función para escalar la imagen.

cv::Mat resizedImage;
cv::resize(image, resizedImage, cv::Size(newWidth, newHeight));

Rotación: usargetRotationMatrix2DywarpAffinela función para rotar la imagen.

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());

Traslación: usarwarpAffinela función para trasladar la imagen.

cv::Mat translationMatrix = (cv::Mat_<double>(2, 3) << 1, 0, tx, 0, 1, ty);
cv::Mat translatedImage;
cv::warpAffine(image, translatedImage, translationMatrix, image.size());

Volteo: usarflipla función para voltear la imagen.

cv::Mat flippedImage;
cv::flip(image, flippedImage, 1); // 1表示水平翻转,0表示垂直翻转

Transformación afín y transformación de perspectiva

Transformación afín: La transformación afín es una transformación lineal más traslación; se puede usarwarpAffinela función para implementarla.

cv::Mat affineMatrix = cv::getAffineTransform(srcPoints, dstPoints);
cv::Mat affineImage;
cv::warpAffine(image, affineImage, affineMatrix, image.size());

Transformación de perspectiva: La transformación de perspectiva es una transformación más general; se puede usarwarpPerspectivela función para implementarla.

cv::Mat perspectiveMatrix = cv::getPerspectiveTransform(srcPoints, dstPoints);
cv::Mat perspectiveImage;
cv::warpPerspective(image, perspectiveImage, perspectiveMatrix, image.size());

Conversión del espacio de color de imágenes

Espacios de color como RGB, escala de grises, HSV

Los espacios de color de una imagen incluyen RGB, escala de grises y HSV, etc.

  • RGB: RGB es el espacio de color más común y representa los tres canales: rojo, verde y azul.
  • Escala de grises: La imagen en escala de grises tiene un solo canal y representa el brillo.
  • HSV: El espacio de color HSV representa el tono (Hue), la saturación (Saturation) y el brillo (Value).

Conversión del espacio de color

UsarcvtColorla función para realizar la conversión del espacio de color.

RGB a escala de grises:

cv::Mat grayImage;
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

RGB a HSV:

cv::Mat hsvImage;
cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);

Separación y combinación de canales

Separación de canales: usarsplitla función para separar los canales de la imagen.

std::vector<cv::Mat> channels;
cv::split(image, channels);

Combinación de canales: usarmergela función para combinar varios canales en una sola imagen.

cv::Mat mergedImage;
cv::merge(channels, mergedImage);

Ejemplo

Las operaciones básicas de C++ OpenCV incluyen lectura, visualización, guardado de imágenes, operaciones de píxeles, obtención de propiedades de imagen, etc.

A continuación se muestran algunas operaciones básicas comunes de OpenCV y sus ejemplos de código:

1. Leer y mostrar imágenes

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    // Verificar si la imagen se cargó correctamente
    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Mostrar la imagen
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", image);

    // Esperar una tecla
    waitKey(0);

    // Cerrar la ventana
    destroyAllWindows();

    return 0;
}

2. Guardar imágenes

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Guardar la imagen
    bool isSaved = imwrite("saved_image.jpg", image);
    if (isSaved) {
        cout << "¡Imagen guardada exitosamente!" << endl;
    } else {
        cout << "¡Error al guardar la imagen!" << endl;
    }

    return 0;
}

3. Obtener propiedades de la imagen

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Obtener las propiedades de la imagen
    int width = image.cols;  // Ancho de la imagen
    int height = image.rows; // Alto de la imagen
    int channels = image.channels(); // Número de canales de la imagen

    cout << "Ancho de la imagen: " << width << endl;
    cout << "Alto de la imagen: " << height << endl;
    cout << "Número de canales de la imagen: " << channels << endl;

    return 0;
}

4. Acceder y modificar valores de píxeles

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Acceder al valor de píxel (formato BGR)
    Vec3b pixel = image.at<Vec3b>(100, 100); // Obtener el valor de píxel en la posición (100, 100)
    cout << "B: " << (int)pixel[0] << ", G: " << (int)pixel[1] << ", R: " << (int)pixel[2] << endl;

    // Modificar el valor de píxel
    image.at<Vec3b>(100, 100) = Vec3b(255, 0, 0); // Establecer el píxel en la posición (100, 100) como azul

    // Mostrar la imagen modificada
    imshow("Modified Image", image);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

5. Conversión del espacio de color de la imagen

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Convertir a imagen en escala de grises
    Mat grayImage;
    cvtColor(image, grayImage, COLOR_BGR2GRAY);

    // Mostrar la imagen en escala de grises
    imshow("Gray Image", grayImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

6. Recorte y escalado de imágenes

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Recortar la imagen
    Rect roi(100, 100, 200, 200); // (x, y, width, height)
    Mat croppedImage = image(roi);

    // Escalar la imagen
    Mat resizedImage;
    resize(image, resizedImage, Size(400, 400)); // Escalar a 400x400

    // Mostrar la imagen recortada y escalada
    imshow("Cropped Image", croppedImage);
    imshow("Resized Image", resizedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

7. Copia y clonación de imágenes

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Copiar la imagen
    Mat copiedImage = image.clone();

    // Modificar la imagen copiada
    circle(copiedImage, Point(100, 100), 50, Scalar(0, 255, 0), 2); // Dibujar un círculo en la imagen copiada

    // Mostrar la imagen original y la imagen modificada
    imshow("Original Image", image);
    imshow("Copied Image", copiedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

8. Transformaciones geométricas de imágenes

Ejemplo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Leer la imagen
    Mat image = imread("test.jpg");

    if (image.empty()) {
        cout << "Error: no se pudo cargar la imagen, verifique si la ruta es correcta." << endl;
        return -1;
    }

    // Rotar la imagen
    Mat rotatedImage;
    Point2f center(image.cols / 2, image.rows / 2); // Centro de rotación
    double angle = 45; // Ángulo de rotación
    double scale = 1.0; // Factor de escala
    Mat rotationMatrix = getRotationMatrix2D(center, angle, scale);
    warpAffine(image, rotatedImage, rotationMatrix, image.size());

    // Mostrar la imagen rotada
    imshow("Rotated Image", rotatedImage);
    waitKey(0);
    destroyAllWindows();

    return 0;
}
Otras extensiones