Opérations de base C++ OpenCV
Opérations de base sur les images
Lire, afficher et enregistrer des images
Dans OpenCV, les opérations de base sur les images comprennent la lecture, l'affichage et l'enregistrement d'images. Ces opérations constituent le fondement du traitement d'images.
Lecture d'images: Utilisez laimreadfonction pour lire une image. Le premier paramètre de cette fonction est le chemin du fichier image, et le second paramètre est le mode de lecture de l'image (par exemple image couleur, image en niveaux de gris, etc.).
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
Affichage d'images: Utilisez laimshowfonction pour afficher une image. Le premier paramètre de cette fonction est le nom de la fenêtre, et le second paramètre est l'image à afficher.
cv::imshow("Display Window", image);
cv::waitKey(0); // 等待按键按下
Enregistrement d'images: Utilisez laimwritefonction pour enregistrer une image. Le premier paramètre de cette fonction est le chemin du fichier à enregistrer, et le second paramètre est l'image à enregistrer.
cv::imwrite("output.jpg", image);
Propriétés de base des images
Les propriétés de base d'une image comprennent la taille, le nombre de canaux et les valeurs des pixels.
Taille: La taille d'une image peut être obtenue via larowsetcolsattribut.
int height = image.rows; int width = image.cols;
Nombre de canaux: Le nombre de canaux d'une image peut être obtenu via lachannels()méthode.
int channels = image.channels();
Valeurs des pixels: sont accessibles via laatméthode pour accéder aux valeurs des pixels d'une image.
cv::Vec3b pixel = image.at<cv::Vec3b>(y, x); // 访问(x, y)处的像素值
Création et initialisation d'images
Vous pouvez utiliser laMatclasse pour créer et initialiser des images.
Création d'images: Vous pouvez créer une image d'une taille et d'un type spécifiés.
cv::Mat newImage(480, 640, CV_8UC3, cv::Scalar(0, 0, 255)); // 创建一个640x480的红色图像
Initialisation d'images: Utilisez lasetTométhode pour initialiser une image.
image.setTo(cv::Scalar(255, 255, 255)); // 将图像初始化为白色
Opérations sur les pixels des images
Les opérations sur les pixels d'une image incluent l'itération sur les pixels et la modification des valeurs des pixels.
Itération sur les pixels: Vous pouvez utiliser une double boucle pour parcourir chaque pixel de l'image.
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);
// 对像素进行操作
}
}
Modification des valeurs de pixels: Vous pouvez modifier directement la valeur d’un pixel.
pixel[0] = 255; // 将蓝色通道设置为255 pixel[1] = 0; // 将绿色通道设置为0 pixel[2] = 0; // 将红色通道设置为0
Transformations géométriques d’images
Mise à l’échelle, rotation, translation et retournement
Les transformations géométriques d’une image incluent la mise à l’échelle, la rotation, la translation et le retournement.
Mise à l’échelle: Utilisez laresizefonction pour mettre une image à l’échelle.
cv::Mat resizedImage; cv::resize(image, resizedImage, cv::Size(newWidth, newHeight));
Rotation: Utilisez lagetRotationMatrix2DetwarpAffinefonction pour faire pivoter une image.
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());
Translation: Utilisez lawarpAffinefonction pour translater une image.
cv::Mat translationMatrix = (cv::Mat_<double>(2, 3) << 1, 0, tx, 0, 1, ty); cv::Mat translatedImage; cv::warpAffine(image, translatedImage, translationMatrix, image.size());
Retournement: Utilisez laflipfonction pour retourner une image.
cv::Mat flippedImage; cv::flip(image, flippedImage, 1); // 1表示水平翻转,0表示垂直翻转
Transformation affine et transformation perspective
Transformation affine: Une transformation affine est une transformation linéaire plus une translation, et peut être mise en œuvre à l'aide dewarpAffinefonction.
cv::Mat affineMatrix = cv::getAffineTransform(srcPoints, dstPoints); cv::Mat affineImage; cv::warpAffine(image, affineImage, affineMatrix, image.size());
Transformation perspective: Une transformation perspective est une transformation plus générale, et peut être mise en œuvre à l'aide dewarpPerspectivefonction.
cv::Mat perspectiveMatrix = cv::getPerspectiveTransform(srcPoints, dstPoints); cv::Mat perspectiveImage; cv::warpPerspective(image, perspectiveImage, perspectiveMatrix, image.size());
Conversion d'espace colorimétrique des images
Espaces colorimétriques tels que RGB, niveaux de gris et HSV
Les espaces colorimétriques d'une image incluent RGB, niveaux de gris, HSV, etc.
- RGB: RGB est l'espace colorimétrique le plus courant, représentant trois canaux : rouge, vert et bleu.
- Niveaux de gris: Une image en niveaux de gris n'a qu'un seul canal, qui représente la luminosité.
- HSV: L'espace colorimétrique HSV représente la teinte, la saturation et la valeur.
Conversion d'espace colorimétrique
Utilisez lacvtColorfonction pour effectuer une conversion d'espace colorimétrique.
RGB vers niveaux de gris:
cv::Mat grayImage; cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
RGB vers HSV:
cv::Mat hsvImage; cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);
Séparation et fusion des canaux
Séparation des canaux: Utilisez lasplitfonction pour séparer les canaux d'une image.
std::vector<cv::Mat> channels; cv::split(image, channels);
Fusion des canaux: Utilisez lamergefonction pour fusionner plusieurs canaux en une seule image.
cv::Mat mergedImage; cv::merge(channels, mergedImage);
Exemples
Les opérations de base de C++ OpenCV incluent la lecture, l'affichage et l'enregistrement d'images, les opérations sur les pixels, l'obtention des propriétés d'image, etc.
Voici quelques opérations de base courantes d'OpenCV et leurs exemples de code :
1. Lecture et affichage d'images
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
// Vérifier si l'image a été chargée avec succès
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Afficher l'image
namedWindow("Afficher l'image", WINDOW_AUTOSIZE);
imshow("Afficher l'image", image);
// Attendre une pression de touche
waitKey(0);
// Fermer la fenêtre
destroyAllWindows();
return 0;
}
2. Enregistrement des images
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Enregistrer l'image
bool isSaved = imwrite("saved_image.jpg", image);
if (isSaved) {
cout << "Image enregistrée avec succès !" << endl;
} else {
cout << "Échec de l'enregistrement de l'image !" << endl;
}
return 0;
}
3. Obtention des propriétés de l'image
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Obtenir les propriétés de l'image
int width = image.cols; // Largeur de l'image
int height = image.rows; // Hauteur de l'image
int channels = image.channels(); // Nombre de canaux de l'image
cout << "Largeur de l'image : " << width << endl;
cout << "Hauteur de l'image : " << height << endl;
cout << "Nombre de canaux de l'image : " << channels << endl;
return 0;
}
4. Accès et modification des valeurs des pixels
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Accéder aux valeurs des pixels (format BGR)
Vec3b pixel = image.at<Vec3b>(100, 100); // Obtenir la valeur du pixel à la position (100, 100)
cout << "B: " << (int)pixel[0] << ", G: " << (int)pixel[1] << ", R: " << (int)pixel[2] << endl;
// Modifier la valeur du pixel
image.at<Vec3b>(100, 100) = Vec3b(255, 0, 0); // Définir le pixel à la position (100, 100) en bleu
// Afficher l'image modifiée
imshow("Image modifiée", image);
waitKey(0);
destroyAllWindows();
return 0;
}
5. Conversion de l'espace colorimétrique d'image
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Convertir en image en niveaux de gris
Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);
// Afficher l'image en niveaux de gris
imshow("Image en niveaux de gris", grayImage);
waitKey(0);
destroyAllWindows();
return 0;
}
6. Recadrage et mise à l'échelle des images
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Recadrer l'image
Rect roi(100, 100, 200, 200); // (x, y, largeur, hauteur)
Mat croppedImage = image(roi);
// Mettre l'image à l'échelle
Mat resizedImage;
resize(image, resizedImage, Size(400, 400)); // Redimensionner à 400x400
// Afficher l'image recadrée et redimensionnée
imshow("Image recadrée", croppedImage);
imshow("Image redimensionnée", resizedImage);
waitKey(0);
destroyAllWindows();
return 0;
}
7. Copie et clonage d'images
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Copier l'image
Mat copiedImage = image.clone();
// Modifier l'image copiée
circle(copiedImage, Point(100, 100), 50, Scalar(0, 255, 0), 2); // Dessiner un cercle sur l'image copiée
// Afficher l'image originale et l'image modifiée
imshow("Image originale", image);
imshow("Image copiée", copiedImage);
waitKey(0);
destroyAllWindows();
return 0;
}
8. Transformations géométriques d'images
Exemple
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// Lire l'image
Mat image = imread("test.jpg");
if (image.empty()) {
cout << "Erreur : Échec du chargement de l'image, veuillez vérifier que le chemin est correct." << endl;
return -1;
}
// Pivoter l'image
Mat rotatedImage;
Point2f center(image.cols / 2, image.rows / 2); // Centre de rotation
double angle = 45; // Angle de rotation
double scale = 1.0; // Facteur d'échelle
Mat rotationMatrix = getRotationMatrix2D(center, angle, scale);
warpAffine(image, rotatedImage, rotationMatrix, image.size());
// Afficher l'image pivotée
imshow("Image pivotée", rotatedImage);
waitKey(0);
destroyAllWindows();
return 0;
}