qt image-processing opencv wxwidgets

OpenCV con otra GUI(como Qt o WxWidgets) en Win32 VC++



image-processing (5)

¿Es necesario hacer algo para deshabilitar el higui de OpenCV para que no interfiera con la biblioteca de GUI preferida y, de ser así, cómo?

Respuesta: No veo por qué no debería ser factible o es una biblioteca mal diseñada (lo cual no creo que sea OpenCV).

Para sus otras preguntas (y el "Cómo" de la pregunta 1), hice una búsqueda rápida en QtCentre y encontré un hilo interesante sobre la integración de OpenCV con Qt . Hay algunos ejemplos de código fuente que puedes ver.

Si no encuentra lo que busca en ese hilo, puede comenzar uno nuevo.

O busque la integración de OpenCV en Qt en Google o busque en Google Code, hay algunos proyectos que usan tanto Qt como OpenCV ( OpenCV Stereo Vision es uno ).

Buena suerte.

Quiero usar las funciones de procesamiento de imágenes de OpenCV, pero no la GUI de OpenCV. Estoy usando OpenCV 2.0. Usaré Qt4 o WxWidgets para las funciones GUI. Compilo con VC ++ 2008 Express (VC ++ 9.0).

Supongo que se divide en dos o tres preguntas:

  1. ¿Es necesario hacer algo para deshabilitar el higui de OpenCV para que no interfiera con la biblioteca de GUI preferida y, de ser así, cómo?

  2. ¿Cómo convertir una imagen OpenCV en algo (mapa de bits?) Que la GUI preferida pueda mostrar (y quizás guardar)?

  3. (Opcional) ¿Cómo convertir una imagen que se cargó usando la interfaz preferida en un formulario que OpenCV puede usar?


Bueno, no sé mucho sobre OpenCV, pero trabajo con wxWidgets alot.

Recomiendo altamente wxWidgets simplemente por su estructura intuitiva y diseño de código.

Además, QT solo está disponible bajo la licencia LGPL en Windows, por lo que las licencias pueden ser un problema. wxWidgets se puede utilizar en proyectos comerciales sin restricciones.

En cuanto a la conversión de imágenes de ida y vuelta, wxWidgets tiene una gran cantidad de clases / funciones para trabajar con imágenes.


Bueno. Tengo la respuesta a mi propia pregunta para WxWidgets. Una de las claves es no pelear contra OpenCV City Hall por la secuencia RGB. OpenCv realmente le gusta "BGR". WxWidgets utiliza "RGB" solamente. La estructura de datos abierta tiene un campo para la secuencia de bytes, pero rara vez se respeta. Incluso la función highGui (en MS Windows) que muestra una imagen colocará espectaculares mandarinas azules si la secuencia de bytes se establece en "RGB". Solucioné obstinadamente ese error en mi instalación local, pero otras operaciones también fallaron. Entonces, solo suspiro y establezco el orden de bytes en el lado abierto a "BGR" y hago el intercambio de bytes según sea necesario.

El código de C ++ a continuación requiere que las imágenes de openCV que convierte a wxImages sean RGB, secuencia "BGR", profundidad de 8 bits y 3 canales intercalados, y tengan width_step = width * 3. Las rutinas no comprueban la compatibilidad. Utilice a su propio riesgo. Una versión lista para el horario estelar proporcionaría regiones de interés (ROI) y otras fantasías.

#include "wx/wx.h" #include "cv.h" #include "highgui.h" // Optional void copy_and_swap_rb(char *s, char *d, int size) { // Copy image data source s to destination d, swapping R and B channels. // Assumes 8 bit depth, 3 interleaved channels, and width_step = width*3 const int step = 3; char *end = s + size; while (s<end) { d[0] = s[2]; d[1] = s[1]; d[2] = s[0]; d += step; s += step; } } void wx2cv(wxImage &wx, IplImage *ipl) { // Copy image data from wxWidgets image to Ipl (opencv) image // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and // has the same size as the wxImage, and width_step = width*3. copy_and_swap_rb((char*)wx.GetData(), ipl->imageData, ipl->imageSize); } void cv2wx(IplImage *ipl, wxImage &wx ) { // Copy image data from Ipl (opencv) image to wxImage // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and // has the same size as the wxImage, and width_step = width*3. copy_and_swap_rb( ipl->imageData, (char*)wx.GetData(), wx.GetWidth()*wx.GetHeight()*3); } IplImage *cv_from_wx(wxImage &wx) { // Return a new IplImage copied from a wxImage. // Must be freed by user with cvReleaseImage(). IplImage *ret = cvCreateImage(cvSize(wx.GetWidth(), wx.GetHeight()), IPL_DEPTH_8U, 3); wx2cv(wx, ret); return ret; } wxImage wx_from_cv( IplImage *cx) { // Return new wxImage copied from a compatible IplImage. // Assumes ipl image has seq "GBR", depth 8, and 3 channels // Fear not. The copy on return is cheap; does not deep-copy the data. wxImage wx(cx->width, cx->height, (unsigned char*) malloc(cx->imageSize), false); cv2wx(cx, wx); return wx; }


He hecho un pequeño progreso. La parte de GUI de OpenCV parece mantenerse fuera del camino. Incluso lo he usado en una aplicación WxWidgets para mostrar una imagen, y nada malo parecía suceder. Eso fue en una caja de Windows XP usando VC ++ 2008. La única interacción que OpenCV / highGUI parece tener con el sistema de ventanas es hacer llamadas directas a la API de Windows y monitorear la cola de eventos para eventos de teclado, que pasa.

Estoy trabajando en cómo convertir de imágenes OpenCV a imágenes WxWidgets y viceversa. Una gran ayuda que ustedes son. :-)


Sé que llego muy tarde a esta discusión, pero acabo de encontrarla. De todos modos, he estado usando OpenCV y wxWidgets juntos muy felices durante algunos años, así que pensé en colaborar:

¿Es necesario hacer algo para deshabilitar el higui de OpenCV para que no interfiera con la biblioteca de GUI preferida y, de ser así, cómo?

Generalmente no. Hay un par de problemas que puedes encontrar para versiones específicas de OpenCV y Windows. En su mayor parte, sin embargo, la integración es muy suave. Rutinariamente uso wx para mi parte frontal y las partes de highgui que permiten la captura de imágenes. He hecho esto en varias versiones de Windows, Ubuntu y OS X.

¿Cómo convertir una imagen OpenCV en algo (mapa de bits?) Que la GUI preferida pueda mostrar (y quizás guardar)?

Una alternativa a la copia de ida y vuelta entre una imagen wx es rellenar los datos de IplImage directamente en una textura OpenGL y pintarlos en un wxGLCanvas. Una gran ventaja de esta estrategia es que luego puede dibujar sobre la textura utilizando los métodos estándar de OpenGL.

(Opcional) ¿Cómo convertir una imagen que se cargó usando la interfaz preferida en un formulario que OpenCV puede usar?

Don''t :) Yo uso wxFileDialog etc. para permitir que el usuario especifique rutas, pero todo el backend es directamente OpenCV.

(Comience el auto-enchufe)

El código que escribí para hacer mucho de esto es parte de un proyecto llamado MADTraC , que es un marco de GUI / aplicación para aplicaciones de visión de computadora en tiempo real.

(termine el enchufe)