mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-01-26 23:10:34 +05:00
Add support for OpenCV 4.x needed for Debian/sid (will be Debian 11).
This commit is contained in:
parent
ae18a6997b
commit
1b78618638
@ -28,13 +28,12 @@
|
|||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
#include <opencv2/core/version.hpp>
|
#include <opencv2/core/version.hpp>
|
||||||
|
#include <opencv2/imgcodecs.hpp>
|
||||||
|
|
||||||
|
#if CV_MAJOR_VERSION < 3
|
||||||
#if CV_MAJOR_VERSION == 3
|
#error OpenCV version below 3 is not supported
|
||||||
#define cvCvtPixToPlane cvSplit
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// TODO : All the following methods but ComputeContours use the C API of OpenCV while ComputContours
|
// TODO : All the following methods but ComputeContours use the C API of OpenCV while ComputContours
|
||||||
// uses the C++ API of the library.
|
// uses the C++ API of the library.
|
||||||
// This should be homogenized and preferably by using the C++ API (which is more recent for all the methods
|
// This should be homogenized and preferably by using the C++ API (which is more recent for all the methods
|
||||||
@ -65,10 +64,16 @@ void ShapeRec_FeatureDetector::SetPath( const std::string& thePath )
|
|||||||
imagePath = thePath;
|
imagePath = thePath;
|
||||||
if (imagePath != "")
|
if (imagePath != "")
|
||||||
{
|
{
|
||||||
|
#if CV_MAJOR_VERSION > 3
|
||||||
|
cv::Mat src = cv::imread(imagePath.c_str(), cv::IMREAD_COLOR);
|
||||||
|
imgHeight = src.size().height;
|
||||||
|
imgWidth = src.size().width;
|
||||||
|
#else
|
||||||
IplImage* src = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR);
|
IplImage* src = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR);
|
||||||
imgHeight = src->height;
|
imgHeight = src->height;
|
||||||
imgWidth = src->width;
|
imgWidth = src->width;
|
||||||
cvReleaseImage(&src);
|
cvReleaseImage(&src);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +85,31 @@ void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters*
|
|||||||
ShapeRec_CornersParameters* aCornersParameters = dynamic_cast<ShapeRec_CornersParameters*>( parameters );
|
ShapeRec_CornersParameters* aCornersParameters = dynamic_cast<ShapeRec_CornersParameters*>( parameters );
|
||||||
if ( !aCornersParameters ) aCornersParameters = new ShapeRec_CornersParameters();
|
if ( !aCornersParameters ) aCornersParameters = new ShapeRec_CornersParameters();
|
||||||
|
|
||||||
|
#if CV_MAJOR_VERSION > 3
|
||||||
|
cv::Mat src_img_gray = cv::imread (imagePath.c_str(), cv::IMREAD_GRAYSCALE);
|
||||||
|
|
||||||
|
if ( useROI )
|
||||||
|
{
|
||||||
|
// If a ROI as been set use it for detection
|
||||||
|
src_img_gray = src_img_gray(rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<cv::Point2f> corners;
|
||||||
|
// image height and width
|
||||||
|
imgHeight = src_img_gray.size().height;
|
||||||
|
imgWidth = src_img_gray.size().width;
|
||||||
|
|
||||||
|
cv::goodFeaturesToTrack (src_img_gray, corners, cornerCount,
|
||||||
|
aCornersParameters->qualityLevel, aCornersParameters->minDistance,
|
||||||
|
cv::noArray(), 3, false);
|
||||||
|
|
||||||
|
cv::cornerSubPix
|
||||||
|
(src_img_gray, corners,
|
||||||
|
cvSize (aCornersParameters->kernelSize, aCornersParameters->kernelSize),
|
||||||
|
cvSize (-1, -1),
|
||||||
|
cvTermCriteria (aCornersParameters->typeCriteria, aCornersParameters->maxIter, aCornersParameters->epsilon));
|
||||||
|
|
||||||
|
#else
|
||||||
// Images to be used for detection
|
// Images to be used for detection
|
||||||
IplImage *eig_img, *temp_img, *src_img_gray;
|
IplImage *eig_img, *temp_img, *src_img_gray;
|
||||||
|
|
||||||
@ -109,7 +139,7 @@ void ShapeRec_FeatureDetector::ComputeCorners( bool useROI, ShapeRec_Parameters*
|
|||||||
cvReleaseImage (&eig_img);
|
cvReleaseImage (&eig_img);
|
||||||
cvReleaseImage (&temp_img);
|
cvReleaseImage (&temp_img);
|
||||||
cvReleaseImage (&src_img_gray);
|
cvReleaseImage (&src_img_gray);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -145,6 +175,68 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
|
|||||||
}
|
}
|
||||||
else //COLORFILTER
|
else //COLORFILTER
|
||||||
{
|
{
|
||||||
|
#if CV_MAJOR_VERSION > 3
|
||||||
|
cv::Mat input_image = cv::imread(imagePath.c_str(), cv::IMREAD_COLOR);
|
||||||
|
|
||||||
|
ShapeRec_ColorFilterParameters* aColorFilterParameters = dynamic_cast<ShapeRec_ColorFilterParameters*>( parameters );
|
||||||
|
if ( !aColorFilterParameters ) aColorFilterParameters = new ShapeRec_ColorFilterParameters();
|
||||||
|
|
||||||
|
cv::GaussianBlur( input_image, input_image,
|
||||||
|
cvSize (aColorFilterParameters->smoothSize, aColorFilterParameters->smoothSize), 0 );
|
||||||
|
|
||||||
|
cv::Mat sample_image = input_image(rect);
|
||||||
|
|
||||||
|
cv::Mat sample_hsv;
|
||||||
|
|
||||||
|
cv::cvtColor(sample_image, sample_hsv, CV_BGR2HSV);
|
||||||
|
|
||||||
|
/// Separate the image in 3 places ( H, S and V )
|
||||||
|
std::vector<cv::Mat> hsv_planes;
|
||||||
|
cv::split( sample_image, hsv_planes );
|
||||||
|
|
||||||
|
cv::Mat sample_planes[] = { hsv_planes[0], hsv_planes[1] };
|
||||||
|
|
||||||
|
// Create the hue / saturation histogram of the SAMPLE image.
|
||||||
|
// This histogramm will be representative of what is the zone
|
||||||
|
// we want to find the frontier of. Indeed, the sample image is meant to
|
||||||
|
// be representative of this zone
|
||||||
|
const float hranges[] = { 0, 180 };
|
||||||
|
const float sranges[] = { 0, 256 };
|
||||||
|
const float* ranges[] = { hranges, sranges };
|
||||||
|
|
||||||
|
cv::Mat sample_hist;
|
||||||
|
cv::calcHist( sample_planes, 2, 0, cv::Mat(), sample_hist, 1, aColorFilterParameters->histSize, ranges );
|
||||||
|
|
||||||
|
// Calculate the back projection of hue and saturation planes of the INPUT image
|
||||||
|
// by mean of the histogram of the SAMPLE image.
|
||||||
|
//
|
||||||
|
// The pixels which (h,s) coordinates correspond to high values in the histogram
|
||||||
|
// will have high values in the grey image result. It means that a pixel of the INPUT image
|
||||||
|
// which is more probably in the zone represented by the SAMPLE image, will be whiter
|
||||||
|
// in the back projection.
|
||||||
|
|
||||||
|
// Get hue and saturation planes of the INPUT image
|
||||||
|
cv::Mat input_hsv;
|
||||||
|
cv::cvtColor(input_image, input_hsv, CV_BGR2HSV);
|
||||||
|
|
||||||
|
/// Separate the image in 3 places ( H, S and V )
|
||||||
|
std::vector<cv::Mat> input_hsv_planes;
|
||||||
|
cv::split( input_hsv, input_hsv_planes );
|
||||||
|
|
||||||
|
cv::Mat input_planes[] = { input_hsv_planes[0], input_hsv_planes[1] };
|
||||||
|
|
||||||
|
cv::Mat backproject, binary_backproject;
|
||||||
|
|
||||||
|
// Compute the back projection
|
||||||
|
cv::calcBackProject(input_planes, 2, 0, sample_hist, backproject, ranges);
|
||||||
|
|
||||||
|
// Threshold in order to obtain a binary image
|
||||||
|
cv::threshold(backproject, binary_backproject,
|
||||||
|
aColorFilterParameters->threshold, aColorFilterParameters->maxThreshold, cv::THRESH_BINARY);
|
||||||
|
|
||||||
|
detected_edges = cv::Mat(binary_backproject);
|
||||||
|
|
||||||
|
#else
|
||||||
// Load the input image where we want to detect contours
|
// Load the input image where we want to detect contours
|
||||||
IplImage* input_image = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR);
|
IplImage* input_image = cvLoadImage(imagePath.c_str(),CV_LOAD_IMAGE_COLOR);
|
||||||
|
|
||||||
@ -169,7 +261,7 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
|
|||||||
|
|
||||||
cvCvtColor(sample_image, sample_hsv, CV_BGR2HSV);
|
cvCvtColor(sample_image, sample_hsv, CV_BGR2HSV);
|
||||||
|
|
||||||
cvCvtPixToPlane(sample_hsv, sample_h_plane, sample_s_plane, 0, 0);
|
cvSplit(sample_hsv, sample_h_plane, sample_s_plane, 0, 0);
|
||||||
IplImage* sample_planes[] = { sample_h_plane, sample_s_plane };
|
IplImage* sample_planes[] = { sample_h_plane, sample_s_plane };
|
||||||
|
|
||||||
// Create the hue / saturation histogram of the SAMPLE image.
|
// Create the hue / saturation histogram of the SAMPLE image.
|
||||||
@ -224,7 +316,7 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
|
|||||||
|
|
||||||
// Get hue and saturation planes of the INPUT image
|
// Get hue and saturation planes of the INPUT image
|
||||||
cvCvtColor(input_image, input_hsv, CV_BGR2HSV);
|
cvCvtColor(input_image, input_hsv, CV_BGR2HSV);
|
||||||
cvCvtPixToPlane(input_hsv, input_hplane, input_splane, 0, 0);
|
cvSplit(input_hsv, input_hplane, input_splane, 0, 0);
|
||||||
IplImage* input_planes[] = { input_hplane, input_splane };
|
IplImage* input_planes[] = { input_hplane, input_splane };
|
||||||
|
|
||||||
// Compute the back projection
|
// Compute the back projection
|
||||||
@ -242,10 +334,7 @@ bool ShapeRec_FeatureDetector::ComputeContours( bool useROI, ShapeRec_Parameters
|
|||||||
cvReleaseImage(&input_splane);
|
cvReleaseImage(&input_splane);
|
||||||
cvReleaseImage(&backproject);
|
cvReleaseImage(&backproject);
|
||||||
|
|
||||||
#if CV_MAJOR_VERSION == 3
|
|
||||||
detected_edges = cv::cvarrToMat(binary_backproject);
|
detected_edges = cv::cvarrToMat(binary_backproject);
|
||||||
#else
|
|
||||||
detected_edges = cv::Mat(binary_backproject);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
// else if ( detection_method == RIDGE_DETECTOR ) // Method adapted for engineering drawings (e.g. watershed functionality could be used here cf.OpenCV documentation and samples)
|
// else if ( detection_method == RIDGE_DETECTOR ) // Method adapted for engineering drawings (e.g. watershed functionality could be used here cf.OpenCV documentation and samples)
|
||||||
|
@ -29,16 +29,18 @@
|
|||||||
// https://tracker.dev.opencascade.org/view.php?id=28457 issue.
|
// https://tracker.dev.opencascade.org/view.php?id=28457 issue.
|
||||||
#ifdef HAVE_TBB
|
#ifdef HAVE_TBB
|
||||||
#undef HAVE_TBB
|
#undef HAVE_TBB
|
||||||
#include <cv.h>
|
|
||||||
#include <highgui.h>
|
#include <opencv2/opencv.hpp>
|
||||||
#include <opencv2/imgproc/imgproc.hpp>
|
#include <opencv2/imgproc.hpp>
|
||||||
#include <opencv2/highgui/highgui.hpp>
|
#include <opencv2/highgui.hpp>
|
||||||
|
#include <opencv2/highgui/highgui_c.h>
|
||||||
#define HAVE_TBB
|
#define HAVE_TBB
|
||||||
#else
|
|
||||||
#include <cv.h>
|
#else // HAVE_TBB
|
||||||
#include <highgui.h>
|
#include <opencv2/opencv.hpp>
|
||||||
#include <opencv2/imgproc/imgproc.hpp>
|
#include <opencv2/imgproc.hpp>
|
||||||
#include <opencv2/highgui/highgui.hpp>
|
#include <opencv2/highgui.hpp>
|
||||||
|
#include <opencv2/highgui/highgui_c.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Qt
|
// Qt
|
||||||
|
Loading…
Reference in New Issue
Block a user