web-dev-qa-db-fra.com

Opencv crée une nouvelle image en utilisant cv :: Mat

Je suis nouveau sur opencv et j'essaie quelques exemples de codes.

dans un seul code, Mat gr(row1,col1,CV_8UC1,scalar(0)); int x = gr.at<uchar> (row,col);

Et dans un autre,

Mat grHistrogram(301,260,CV_8UC1,Scalar(0,0,0));
line(grHistrogram,pt1,pt2,Scalar(255,255,255),1,8,0);

Maintenant, ma question est de savoir si j'ai utilisé scalaire (0) au lieu de scalaire (0,0,0) dans le deuxième code, le code ne fonctionne pas. 1.Pourquoi cela se produit depuis, les deux créent une structure d'image Mat. 2. quel est le but de const cv: Scalar & _s.

Je recherche la Documentaion sur le site Opencv (opencv.pdf, opencv2refman.pdf) et le livre Opencv d'Oreilly. Mais je n'ai pas pu trouver de réponse expliquée.

Je pense que j'utilise la structure Mat (int _rows, int _cols, int _type, const cv: Scalar & _s).

12
Lusy7

Tout d'abord, vous avez besoin des informations suivantes pour créer l'image:

  1. Largeur: 301 pixels
  2. Hauteur: 260 pixels
  3. Chaque valeur de pixel (intensité) est comprise entre 0 et 255: un entier non signé de 8 bits
  4. Prend en charge toutes les couleurs RVB: 3 canaux
  5. Couleur initiale: noir = (B, G, R) = (0, 0, 0)

Vous pouvez créer l'image en utilisant cv::Mat:

Mat grHistogram(260, 301, CV_8UC3, Scalar(0, 0, 0));

Le 8U Signifie le 8 - bit U entier signé, C3 Signifie C canaux pour la couleur RVB, et Scalar(0, 0, 0) est la valeur initiale pour chaque pixel. De même,

line(grHistrogram,pt1,pt2,Scalar(255,255,255),1,8,0);

consiste à tracer une ligne sur grHistogram du point pt1 au point pt2. La couleur de la ligne est blanche (255, 255, 255) avec une épaisseur de 1 pixel, une ligne connectée à 8 et un décalage de 0.

Parfois, vous n'avez pas besoin d'une image RVB, mais d'une simple image en niveaux de gris. Autrement dit, utilisez un canal au lieu de trois. Le type peut être changé en CV_8UC1 Et il vous suffit de spécifier l'intensité pour un canal, Scalar(0) par exemple.

Revenons à votre problème,

Pourquoi cela se produit-il depuis, les deux créent une structure d'image Mat?

Parce que vous devez spécifier le type de Mat. Est-ce une image en couleur CV_8UC3 Ou une image en niveaux de gris CV_8UC1? Ils sont différents. Votre programme peut ne pas fonctionner comme vous le pensez si vous utilisez Scalar(255) sur une image CV_8UC3.

Quel est le but de const cv: Scalar & _s?

cv::Scalar Est utilisé pour spécifier la valeur d'intensité pour chaque pixel. Par exemple, Scalar(255, 0, 0) est bleu et Scalar(0, 0, 0) est noir si le type est CV_8UC3. Ou Scalar(0) est noir s'il s'agit d'une image en niveaux de gris CV_8UC1. Évitez de les mélanger.

21
mcchu

Vous pouvez créer une image à canal unique ou une image à canaux multiples.

création d'une image monocanal: Mat img(500, 1000, CV_8UC1, Scalar(70));

création d'une image multicanal: Mat img1(500, 1000, CV_8UC3, Scalar(10, 100, 150));

vous pouvez voir plus d'exemples et de détails sur la page suivante. https://progtpoint.blogspot.com/2017/01/tutorial-3-create-image.html

6
hashan gunathilaka