Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/03/2021, à 23:14

turboiii

probleme gcc et opencv (résolu)

bonjour

je débute sur opencv, et comme vous vous en doutez la première compilation ne se passe pas bien
Après le rituel d'installation

sudo apt-get install libopencv-dev

j'ai vérifié ce que cela donne

pour compiler

pkg-config opencv --cflags
-I/usr/include/opencv

pour linker

pkg-config opencv --libs
-lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core

l'affaire me semble bien engagée

voici un code d'essai pour voir ce que cela peut donner à partir des tutos officiels

#include <stdio.h>
#include <stdlib.h>
#include <cv.h> // contient les déclarations des structures et fonctions de manipulation d'images
#include <highgui.h> // contient déclarations des fonctions d'affichage des images

#define DEBUG
//#include <opencv/highgui.h>
//#include <highgui.h>

/* gcc opencv_ex02.o -o helloworld `pkg-config opencv --libs`
 * *  gcc -std=c11 -Wall -fmax-errors=10 -Wextra opencv_ex02.c -o opencv_ex02 `pkg-config --cflags --libs opencv `
 */
 
 enum  	{
  CV_LOAD_IMAGE_UNCHANGED =-1,
  CV_LOAD_IMAGE_GRAYSCALE =0,
  CV_LOAD_IMAGE_COLOR =1,
  CV_LOAD_IMAGE_ANYDEPTH =2,
  CV_LOAD_IMAGE_ANYCOLOR =4,
  CV_LOAD_IMAGE_IGNORE_ORIENTATION =128
};

int main (int argc, char* argv[])
{
  IplImage* img = NULL; 
  const char* window_title = "Hello, OpenCV!";

  /* Vérification: au moins un argument doit être passé au programme.*/
  if (argc < 2)
  {
    fprintf (stderr, "usage: %s IMAGE\n", argv[0]);
    return EXIT_FAILURE;
  }
CvArr * image;
cvShowImage("",image);
  /* Chargement de l'image passée en argument */
  img = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);

  if (!img)
  {
    fprintf (stderr, "couldn't open image file: %s\n", argv[1]);
    return EXIT_FAILURE;
  }

  /* Création d'une fenêtre intitulée "Hello, OpenCV!" */
  cvNamedWindow (window_title, CV_WINDOW_AUTOSIZE);

  /* Affichage de l'image */
  cvShowImage (window_title, img);

  /* Pause le temps que l'utilisateur appuie sur une touche */
  cvWaitKey (0);

  /* Destruction de la fenêtre */
  cvDestroyAllWindows ();
  
  /* Libération de la mémoire */
  cvReleaseImage (&img);

  return EXIT_SUCCESS;
}

compilation

gcc -std=c11 -Wall -fmax-errors=10 -Wextra opencv_ex02.c -o opencv_ex02 `pkg-config --cflags --libs opencv `

résultat de compilation

gcc -std=c11 -Wall -fmax-errors=10 -Wextra opencv_ex02.c -o opencv_ex02 `pkg-config --cflags --libs opencv `
opencv_ex02.c: In function ‘main’:
opencv_ex02.c:37:9: warning: implicit declaration of function ‘cvLoadImage’; did you mean ‘cvShowImage’? [-Wimplicit-function-declaration]
   img = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
         ^~~~~~~~~~~
         cvShowImage
opencv_ex02.c:37:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
   img = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
       ^
opencv_ex02.c:35:1: warning: ‘image’ may be used uninitialized in this function [-Wmaybe-uninitialized]
 cvShowImage("",image);
 ^~~~~~~~~~~~~~~~~~~~~
/tmp/ccB983qb.o : Dans la fonction « cvPointFrom32f » :
opencv_ex02.c:(.text+0x557) : référence indéfinie vers « cvRound »
opencv_ex02.c:(.text+0x56d) : référence indéfinie vers « cvRound »
/tmp/ccB983qb.o : Dans la fonction « cvReadInt » :

il y a des erreurs de compilation et de linkage...et un détail m'échappe...

Que se passe t-il d'après vous?

Dernière modification par turboiii (Le 11/03/2021, à 14:20)

Hors ligne

#2 Le 09/03/2021, à 00:45

kamaris

Re : probleme gcc et opencv (résolu)

L'exemple que tu essaies de compiler n'est pas trop vieux par rapport à la version de la bibliothèque ?
Est-ce que tu trouves la fonction cvLoadImage en faisant un grep sur les fichiers sources ?

Hors ligne

#3 Le 09/03/2021, à 10:54

turboiii

Re : probleme gcc et opencv (résolu)

bonjour

je viens de faire un nouvel essai intéressant.
Sur la base de la doc pour obtenir la version d'opencv

#include <stdio.h>
#include <stdlib.h>
#include <cv.h> // contient les déclarations des structures et fonctions de manipulation d'images
#include <highgui.h> // contient déclarations des fonctions d'affichage des images

#define DEBUG
//#include <opencv/highgui.h>
//#include <highgui.h>

/* gcc opencv_ex02.o -o helloworld `pkg-config opencv --libs`
 * *  gcc -std=c11 -Wall -fmax-errors=10 -Wextra opencv_ex02.c -o opencv_ex02 `pkg-config --cflags --libs opencv `
 */
 
 enum  	{
  CV_LOAD_IMAGE_UNCHANGED =-1,
  CV_LOAD_IMAGE_GRAYSCALE =0,
  CV_LOAD_IMAGE_COLOR =1,
  CV_LOAD_IMAGE_ANYDEPTH =2,
  CV_LOAD_IMAGE_ANYCOLOR =4,
  CV_LOAD_IMAGE_IGNORE_ORIENTATION =128
};

int main (int argc, char* argv[])
{
	IplImage* img = NULL; 
	const char* window_title = "Hello, OpenCV!";

	/* version */
	printf("Version %d, major %d, minor %d/n", version(),versionMajor(), versionMinor());

	/* Vérification: au moins un argument doit être passé au programme.*/
	if (argc < 2)
	{
		fprintf (stderr, "usage: %s IMAGE\n", argv[0]);
		return EXIT_FAILURE;
	}
	//CvArr * image;
	//cvShowImage("",image);
	///* Chargement de l'image passée en argument */
	//img = imread(argv[1], CV_LOAD_IMAGE_UNCHANGED);

	//if (!img)
	//{
		//fprintf (stderr, "couldn't open image file: %s\n", argv[1]);
		//return EXIT_FAILURE;
	//}

	///* Création d'une fenêtre intitulée "Hello, OpenCV!" */
	//cvNamedWindow (window_title, CV_WINDOW_AUTOSIZE);

	///* Affichage de l'image */
	//cvShowImage (window_title, img);

	///* Pause le temps que l'utilisateur appuie sur une touche */
	//cvWaitKey (0);

	///* Destruction de la fenêtre */
	//cvDestroyAllWindows ();

	/* Libération de la mémoire */
	cvReleaseImage (&img);

	return EXIT_SUCCESS;
}

avec le résultat suivant

 gcc -std=c11 -Wall -fmax-errors=10 -Wextra opencv_ex02.c -o opencv_ex02 `pkg-config --cflags --libs opencv `
opencv_ex02.c: In function ‘main’:
opencv_ex02.c:29:45: warning: implicit declaration of function ‘version’ [-Wimplicit-function-declaration]
  printf("Version %d, major %d, minor %d/n", version(),versionMajor(), versionMinor());
                                             ^~~~~~~
opencv_ex02.c:29:55: warning: implicit declaration of function ‘versionMajor’ [-Wimplicit-function-declaration]
  printf("Version %d, major %d, minor %d/n", version(),versionMajor(), versionMinor());
                                                       ^~~~~~~~~~~~
opencv_ex02.c:29:71: warning: implicit declaration of function ‘versionMinor’ [-Wimplicit-function-declaration]
  printf("Version %d, major %d, minor %d/n", version(),versionMajor(), versionMinor());
                                                                       ^~~~~~~~~~~~
opencv_ex02.c:26:14: warning: unused variable ‘window_title’ [-Wunused-variable]
  const char* window_title = "Hello, OpenCV!";
              ^~~~~~~~~~~~
/tmp/cccyyOBP.o : Dans la fonction « cvPointFrom32f » :
opencv_ex02.c:(.text+0x557) : référence indéfinie vers « cvRound »
opencv_ex02.c:(.text+0x56d) : référence indéfinie vers « cvRound »
/tmp/cccyyOBP.o : Dans la fonction « cvReadInt » :
opencv_ex02.c:(.text+0xe74) : référence indéfinie vers « cvRound »
/tmp/cccyyOBP.o : Dans la fonction « cvEllipseBox » :
opencv_ex02.c:(.text+0x10dc) : référence indéfinie vers « cvRound »
opencv_ex02.c:(.text+0x10fe) : référence indéfinie vers « cvRound »
/tmp/cccyyOBP.o : Dans la fonction « main » :
opencv_ex02.c:(.text+0x1286) : référence indéfinie vers « versionMinor »
opencv_ex02.c:(.text+0x1293) : référence indéfinie vers « versionMajor »
opencv_ex02.c:(.text+0x129f) : référence indéfinie vers « version »
collect2: error: ld returned 1 exit status

Du coup je pense avec un problème plus gégéral de lien avec les biblothèques qui ne sont pas reconnues correctement non ?

Hors ligne

#4 Le 09/03/2021, à 19:12

kamaris

Re : probleme gcc et opencv (résolu)

Que donne

grep -r cvLoadImage /usr/include/opencv

?

Personnellement, sous Arch Linux (donc avec une version probablement plus récente que la tienne d'opencv), je ne trouve pas cette fonction.
D'où vient le programme que tu essaies de compiler dans ton premier post : peux-tu donner le lien du tuto ?

Dernière modification par kamaris (Le 09/03/2021, à 19:22)

Hors ligne

#5 Le 10/03/2021, à 11:21

turboiii

Re : probleme gcc et opencv (résolu)

Je voulais te faire une réponse très détaillée et le forum m’a fait un tour de C…  et a jeté ma réponse en cours……

Bref
le site initial où j’ai trouvé cette doc date de 2011 à 2013  donc très vieux  http://sdz.tdct.org/sdz/introduction-a- … ateur.html

a la fin du tuto il y a un lien vers un forum avec des dates  2011 à 2013

on découvre dans le forum divers problèmes liés aux versions avec des questions sur le suivi de la doc pas top d’ailleurs.

Moi même je m’y perds

Du coup j’ai suivi ta démarche pour aller fouiller dans les include


dans le fichier /usr/include/opencv2/core/core_c.h il y a des déclarations de fonctions en C

parmi elle cvOpenFileStorage permet de charger un fichier. Je l’ai remplacé à la sauvage dans mon fichier d’essai et regarde ce que cela a donné

opencv_ex02.c:40:35: warning: passing argument 2 of ‘cvOpenFileStorage’ makes pointer from integer without a cast [-Wint-conversion]
  img = cvOpenFileStorage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
                                   ^~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/opencv/cv.h:63:0,
                 from opencv_ex02.c:3:
/usr/include/opencv2/core/core_c.h:1999:24: note: expected ‘CvMemStorage * {aka struct CvMemStorage *}’ but argument is of type ‘int’
 CVAPI(CvFileStorage*)  cvOpenFileStorage( const char* filename, CvMemStorage* memstorage,
                        ^~~~~~~~~~~~~~~~~
opencv_ex02.c:40:8: error: too few arguments to function ‘cvOpenFileStorage’
  img = cvOpenFileStorage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
        ^~~~~~~~~~~~~~~~~
In file included from /usr/include/opencv/cv.h:63:0,
                 from opencv_ex02.c:3:
/usr/include/opencv2/core/core_c.h:1999:24: note: declared here
 CVAPI(CvFileStorage*)  cvOpenFileStorage( const char* filename, CvMemStorage* memstorage,

ce style de réponse m’indique qu’il a trouvé ma commande.

Du coup il ne me reste plus qu’à trouver un site internet qui documente un peu plus ce lot de commande en C  pour avancer sur mon projet. Je vais devoir chercher en ce sens

Si tu as une idée ?

Hors ligne

#6 Le 10/03/2021, à 13:50

kamaris

Re : probleme gcc et opencv (résolu)

turboiii a écrit :

Je voulais te faire une réponse très détaillée et le forum m’a fait un tour de C…  et a jeté ma réponse en cours……

Quand ça te sera arrivé suffisamment de fois, tu auras le réflexe de mettre ta réponse dans un éditeur de texte et de la sauvegarder dès qu'elle dépasse une certaine taille et/ou un certain temps de rédaction ! big_smile

turboiii a écrit :

Si tu as une idée ?

Pas particulièrement, puisque je ne connais pas Opencv, mais j'imagine que le site officiel propose des tutos à jour : c'est plus ou moins ce vers quoi renvoie le Github du projet : https://github.com/opencv/opencv

Mais tu peux déjà installer la documentation hors ligne, qui a l'air assez fournie : https://packages.ubuntu.com/groovy/opencv-doc
Liste des fichiers : https://packages.ubuntu.com/groovy/all/ … c/filelist
Tu ajoutes /usr/share/doc/opencv-doc/opencv4/html/index.html en marque-page dans ton navigateur, et tu travailles à partir de là, vite et bien, et sans même avoir besoin d'une connexion internet smile

Dernière modification par kamaris (Le 10/03/2021, à 14:01)

Hors ligne

#7 Le 10/03/2021, à 18:57

turboiii

Re : probleme gcc et opencv (résolu)

Bon des news du front

Je crains qu'il faille renoncer à utiliser opencv en langage C, snifff

Merci de ton super tuyau pour charger la doc sur PC c’est fait et ça fonctionne.

Voici mon premier essai genre hello world

#include <stdio.h>
#include <opencv2/opencv.hpp>
 /* 
 * g++ -Wall -fmax-errors=10 -Wextra opencv_ex01.c -o opencv_ex01 `pkg-config --cflags --libs opencv `
 */
using namespace cv;
 
int main(int argc, char** argv )
{
    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    }
 
    Mat image;
    image = imread( argv[1], 1 );
 
    if ( !image.data )
    {
        printf("No image data \n");
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);
 
    waitKey(0);
 
    return 0;
}

après compilation avec g++ sans erreur j’ose lancer le programme monstrueux avec une image bingo sa fonctionne !!!.



Du coup pour mon projet de traitement d’image d’astrophoto  pour informatiser un télescope Dobson prend une tournure différente….pour développer tout ou partie en C++

Vu la génèse du C++ je pense que je devrais pouvoir mélanger  C et C++.

https://isocpp.org/wiki/faq/mixing-c-and-cpp

Quand je dis mélanger c’est par exemple avoir mon programme principal en C avec notamment Gtk3+ comme interface graphique en C que je connais très bien,  utiliser la bibliothèque indigo pour piloter l’environnement d’un télescope en C que je découvre. La seule verrue en C++ serait openCV sachant que je voudrais faire apparaître les images traitées sur un écran spécial dédié.
Le tout à rentrer dans un Raspberry 4 avec une configuration musclée à 8Go. Il sera peut-être même nécessaire de répartir la charge sur plusieurs machines. Par exemple le RPI 4 pour opencv et un autre RPI 3  pour  le reste.
nota : je l'ai rédigé sur libreoffice avant:lol:

Hors ligne

#8 Le 10/03/2021, à 21:52

kamaris

Re : probleme gcc et opencv (résolu)

Ah oui apparemment le C++ serait à privilégier, bien que le C puisse encore être utilisé au moins pour certaines choses (peut-être plus anciennes) selon Wikipédia :

https://en.wikipedia.org/wiki/OpenCV#Programming_language a écrit :

OpenCV is written in C++ and its primary interface is in C++, but it still retains a less comprehensive though extensive older C interface. All of the new developments and algorithms appear in the C++ interface.

Mais bon, pour ce qui est d'interfacer du C avec du C++, c'est sûr que ça devrait le faire assez facilement.
Bon courage pour la suite !

Hors ligne

#9 Le 11/03/2021, à 14:17

turboiii

Re : probleme gcc et opencv (résolu)

Ok Il me reste à te remercier pour ton aide précieuse pour démarrer sur cette affaire. je suis sur les rails...

Hors ligne