voussoir icon indicating copy to clipboard operation
voussoir copied to clipboard

Does not build with OpenCV 4

Open rburkey2005 opened this issue 3 years ago • 1 comments

The compiler reports that numerous functions are "not declared in this scope".

Most of the problems are easy to fix — or at least, the error messages from the compiler are easy to eliminate — by adding the following to main.cpp:

#include <opencv2/highgui/highgui_c.h>
#include <opencv2/videoio/videoio_c.h>

After doing that, the only remaining symbols not declared are cvLoadImage and cvSaveImage. This is apparently because they no longer exist, and instead have been replaced by cv::imread and cv::imwrite. Unfortunately, the latter two are different enough from the former two that you'd need more knowledge than I have about OpenCV (namely, zero) to fix them.

I use Linux Mint, and I would simply have worked around the problem by installing OpenCV 2, but unfortunately this seems to be a rather difficult thing to do in recent versions of Linux Mint (and I assume, Ubuntu).

rburkey2005 avatar Sep 11 '22 13:09 rburkey2005

Well, I looked at this a little further, and I find that if I add the following to main.cpp, then at least main.cpp compiles without error. I don't claim that it works, just that it compiles:

// 2022-09-12 RSB --------------------------------------------
#include <opencv2/highgui/highgui_c.h>
#include <opencv2/videoio/videoio_c.h>
#include <opencv2/core/types_c.h>
IplImage * cvLoadImage(const char *filename)
{
  cv::Mat img = cv::imread(filename);
  IplImage copy = cvIplImage(img);
  return (new IplImage(copy));
}
int cvSaveImage(const char *filename, const CvArr *image)
{
  cv::Mat mat = cv::cvarrToMat(image);
  return (cv::imwrite(filename, mat));
}

However, the build fails further on, at marker.cpp. If to marker.cpp I add

#include <opencv2/highgui/highgui_c.h>

then the only error remaining in marker.cpp is

.../voussoir/marker.cpp:176:5: error: ‘cvFindHomography’ was not declared in this scope

But, cvFindHomography has been discontinued in favor of cv::FindHomography. Conceptually, the basic fix for this seems to be to add

#include <opencv2/calib3d.hpp>
#define cvFindHomography(src,dst,h) h = cv::findHomography((src),(dst))

Unfortunately, the datatypes of the src and dst parameters differ, so the compilation still fails due to this incompatibility. I haven't looked into that datatype incompatibility.

rburkey2005 avatar Sep 12 '22 12:09 rburkey2005