¿Cómo configurar los parámetros de OpenCV3 CALCHIST () usando vectores? -- ++ campo con opencv3.1 camp Relacionados El problema

How to set the parameters of OpenCV3 calcHist() using vectors?


1
vote

problema

Español

Estoy calculando un histograma de una imagen de escala de grises utilizando el código anterior; esta funcionando bien

  cv::Mat imgSrc = cv::imread("Image.jpg", cv::IMREAD_UNCHANGED); cv::Mat histogram; //Array for the histogram int channels[] = {0};  int binNumArray[] = {256};  float intensityRanges[] = { 0, 256 };  const float* ranges[] = { intensityRanges }; cv::calcHist( &imgSrc, 1, channels, cv::noArray(), histogram, 1,     binNumArray, ranges, true, false) ;       

en el libro de Kaehler & AMP; Bradski se refieren a esto como las "matrices de estilo C de moda antiguas" y dicen que el nuevo estilo usaría plantillas de vectores STL, y las matrices de las imágenes para calcular el histograma se deben administrar usando CV :: GUINTARRAYOFARRYS. Sin embargo, si trato de reemplazar, por ejemplo, la matriz del canal por:

std :: canales vectoriales {0};

da un error de compilación. Si mis preguntas son estas: 1. ¿Cómo puedo definir las matrices de los 'canales', 'binnumarray', 'intensityranges' usando vectores? 2. ¿Cómo puedo definir la matriz de imágenes de entrada usando CV :: GUINTARRAYOFARRYS?

Original en ingles

I am calculating a histogram from a greyscale image using the above code; it is working fine.

cv::Mat imgSrc = cv::imread("Image.jpg", cv::IMREAD_UNCHANGED); cv::Mat histogram; //Array for the histogram int channels[] = {0};  int binNumArray[] = {256};  float intensityRanges[] = { 0, 256 };  const float* ranges[] = { intensityRanges }; cv::calcHist( &imgSrc, 1, channels, cv::noArray(), histogram, 1,     binNumArray, ranges, true, false) ;     

In the book of Kaehler & Bradski they refer to this as the "old-fashioned C-style arrays" and they say the new style would use STL vector templates, and the arrays of images from which to calculate the histogram are to be given using cv::InputArrayOfArrays. However, if I try to replace for example the channel array by:

std::vector channels {0};

Gives compilation error.So my questions are these: 1. How can I define the arrays of the 'channels', 'binNumArray', 'intensityRanges' using vectors? 2. How can I define the array of input images using cv::InputArrayOfArrays?

     
     
     

Lista de respuestas

4
 
vote

Este ejemplo muestra tanto el "viejo" Enfoque y el "nuevo" < / EM> enfoque , para que puedas apreciar la diferencia. Se basa en el ejemplo que se encuentra en la Documentación de OpenCV . < / p>

El nuevo enfoque "" es solo una envoltura de conveniencia que llama internamente el "antiguo" .

  #include <opencv2opencv.hpp> #include <vector> using namespace cv; using namespace std;   int main() {     Mat3b src = imread("path_to_image");     Mat3b hsv;     cvtColor(src, hsv, CV_BGR2HSV);      Mat hist;     Mat hist2;     {         // Quantize the hue to 30 levels         // and the saturation to 32 levels         int hbins = 30, sbins = 32;         int histSize[] = { hbins, sbins };         // hue varies from 0 to 179, see cvtColor         float hranges[] = { 0, 180 };         // saturation varies from 0 (black-gray-white) to         // 255 (pure spectrum color)         float sranges[] = { 0, 256 };         const float* ranges[] = { hranges, sranges };          // we compute the histogram from the 0-th and 1-st channels         int channels[] = { 0, 1 };         calcHist(&hsv, 1, channels, Mat(), // do not use mask             hist, 2, histSize, ranges,             true, // the histogram is uniform             false);     }      {         // Quantize the hue to 30 levels         // and the saturation to 32 levels         vector<int> histSize = { 30, 32 };         // hue varies from 0 to 179, see cvtColor         // saturation varies from 0 (black-gray-white) to         // 255 (pure spectrum color)         vector<float> ranges = { 0, 180, 0, 256 };         // we compute the histogram from the 0-th and 1-st channels         vector<int> channels = { 0, 1 };          vector<Mat> mats = { hsv };         calcHist(mats, channels, Mat(), // do not use mask             hist2, histSize, ranges,             /*true, // the histogram is uniform, this is ALWAYS true*/             false);     }     return 0; }   

 

This example show both the "old" approach and the "new" approach, so you can appreciate the difference. It's based on the example found in the OpenCV documentation.

The "new" approach is just a convenience wrapper that internally calls the "old" one.

#include <opencv2\opencv.hpp> #include <vector> using namespace cv; using namespace std;   int main() {     Mat3b src = imread("path_to_image");     Mat3b hsv;     cvtColor(src, hsv, CV_BGR2HSV);      Mat hist;     Mat hist2;     {         // Quantize the hue to 30 levels         // and the saturation to 32 levels         int hbins = 30, sbins = 32;         int histSize[] = { hbins, sbins };         // hue varies from 0 to 179, see cvtColor         float hranges[] = { 0, 180 };         // saturation varies from 0 (black-gray-white) to         // 255 (pure spectrum color)         float sranges[] = { 0, 256 };         const float* ranges[] = { hranges, sranges };          // we compute the histogram from the 0-th and 1-st channels         int channels[] = { 0, 1 };         calcHist(&hsv, 1, channels, Mat(), // do not use mask             hist, 2, histSize, ranges,             true, // the histogram is uniform             false);     }      {         // Quantize the hue to 30 levels         // and the saturation to 32 levels         vector<int> histSize = { 30, 32 };         // hue varies from 0 to 179, see cvtColor         // saturation varies from 0 (black-gray-white) to         // 255 (pure spectrum color)         vector<float> ranges = { 0, 180, 0, 256 };         // we compute the histogram from the 0-th and 1-st channels         vector<int> channels = { 0, 1 };          vector<Mat> mats = { hsv };         calcHist(mats, channels, Mat(), // do not use mask             hist2, histSize, ranges,             /*true, // the histogram is uniform, this is ALWAYS true*/             false);     }     return 0; } 
 
 
   
   

Relacionados problema

3  Cultivando video en vivo en OPENCV  ( Cropping live video feed in opencv ) 
Tengo un video en vivo que rastrea objetos verdes y dibuja un rectángulo sobre el área del objeto. Tengo curiosidad en cuanto a cómo podría recortar la alimen...

0  OpenCV Videocapture no se puede abrir el archivo, ¿qué estoy haciendo mal?  ( Opencv videocapture cant open file what am i doing wrong ) 
Estoy compilando en Ubuntu 14.04 usando OpenCV 3.1. Al intentar abrir un archivo de video, le da este error: "no se puede abrir el archivo de video" He ...

0  No se pueden leer archivos .AVI usando Python OpenCV 4.1.2-dev  ( Cant read avi files using python opencv 4 1 2 dev ) 
Quiero ejecutar mis programas de Opencv3.1, pero cuando intento leer un archivo usando cv2.videocapture me muestra el error: Error: (-5: Bad Argument) Ca...

1  OpenCV Python - No se pueden importar módulos de contribución  ( Opencv python cannot import contrib modules ) 
Me las arreglé para construir e instalar con éxito OpenCV 3.1.0 en mi computadora portátil. Sin embargo, en mi escritorio, cualquier intento de importar un ...

6  Perceptrons multicapa en EMGUCV  ( Multi layer perceptrons in emgucv ) 
Estoy tratando de implementar las redes neuronales de perceptrons multicapa (MLP) utilizando EMGUCV 3.1 (una envoltura de red de puntos para la biblioteca de ...

0  Detección de la cara en tiempo real usando OpenCV en Android  ( Real time face detection using opencv in android ) 
Estoy tratando de detectar caras usando la cámara en Android. Estoy usando OPENCV3.1 lib para detección de la cara. Encontré un artículo con respecto a este t...

0  "Se requiere OPENCV_CONTRIB, pero no se encontró" Error al hacer Cenake  ( Opencv contrib is required but was not found error while making cmake ) 
Necesito ejecutar el código en este repositorio: https://github.com/kirilllykov/oni2avi He instalado OpenCV 3.1.0. Cuando construyo el código con cmake, ...

1  Error con initfont - OpenCV 3.1 (Python)  ( Error with initfont opencv 3 1 python ) 
Estoy trabajando en OPENCV 3.1 y me gustaría saber cómo puedo reemplazar: boolean deleteStatus= connector.openSession().execute(delete).wasApplied(); boole...

0  No se pueden dibujar las líneas epipolares en la calibración de la cámara y la reconstrucción 3D utilizando OpenCV y Python  ( Cant draw the epipolar lines in camera calibration and 3d reconstruction using ) 
Después de haber generado la matriz fundamental y esencial de la calibración de la cámara, estoy tratando de obtener las líneas epipolares y dibujarlas en mis...

12  Cómo cortar una imagen verticalmente en dos imágenes de igual tamaño  ( How to cut an image vertically into two equal sized images ) 
Entonces tengo una imagen de 800 x 600 que quiero cortar verticalmente en dos imágenes igualmente de tamaño utilizando OpenCV 3.1.0. Esto significa que al fin...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos