feat: 切换后端至PaddleOCR-NCNN,切换工程为CMake
1.项目后端整体迁移至PaddleOCR-NCNN算法,已通过基本的兼容性测试 2.工程改为使用CMake组织,后续为了更好地兼容第三方库,不再提供QMake工程 3.重整权利声明文件,重整代码工程,确保最小化侵权风险 Log: 切换后端至PaddleOCR-NCNN,切换工程为CMake Change-Id: I4d5d2c5d37505a4a24b389b1a4c5d12f17bfa38c
This commit is contained in:
@ -0,0 +1,173 @@
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Container;
|
||||
import java.awt.Image;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSlider;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.CvType;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfFloat;
|
||||
import org.opencv.core.MatOfInt;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.core.Scalar;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class CalcBackProject1 {
|
||||
private Mat hue;
|
||||
private Mat histImg = new Mat();
|
||||
private JFrame frame;
|
||||
private JLabel imgLabel;
|
||||
private JLabel backprojLabel;
|
||||
private JLabel histImgLabel;
|
||||
private static final int MAX_SLIDER = 180;
|
||||
private int bins = 25;
|
||||
|
||||
public CalcBackProject1(String[] args) {
|
||||
//! [Read the image]
|
||||
if (args.length != 1) {
|
||||
System.err.println("You must supply one argument that corresponds to the path to the image.");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
Mat src = Imgcodecs.imread(args[0]);
|
||||
if (src.empty()) {
|
||||
System.err.println("Empty image: " + args[0]);
|
||||
System.exit(0);
|
||||
}
|
||||
//! [Read the image]
|
||||
|
||||
//! [Transform it to HSV]
|
||||
Mat hsv = new Mat();
|
||||
Imgproc.cvtColor(src, hsv, Imgproc.COLOR_BGR2HSV);
|
||||
//! [Transform it to HSV]
|
||||
|
||||
//! [Use only the Hue value]
|
||||
hue = new Mat(hsv.size(), hsv.depth());
|
||||
Core.mixChannels(Arrays.asList(hsv), Arrays.asList(hue), new MatOfInt(0, 0));
|
||||
//! [Use only the Hue value]
|
||||
|
||||
// Create and set up the window.
|
||||
frame = new JFrame("Back Projection 1 demo");
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
// Set up the content pane.
|
||||
Image img = HighGui.toBufferedImage(src);
|
||||
addComponentsToPane(frame.getContentPane(), img);
|
||||
//! [Show the image]
|
||||
// Use the content pane's default BorderLayout. No need for
|
||||
// setLayout(new BorderLayout());
|
||||
// Display the window.
|
||||
frame.pack();
|
||||
frame.setVisible(true);
|
||||
//! [Show the image]
|
||||
}
|
||||
|
||||
private void addComponentsToPane(Container pane, Image img) {
|
||||
if (!(pane.getLayout() instanceof BorderLayout)) {
|
||||
pane.add(new JLabel("Container doesn't use BorderLayout!"));
|
||||
return;
|
||||
}
|
||||
|
||||
//! [Create Trackbar to enter the number of bins]
|
||||
JPanel sliderPanel = new JPanel();
|
||||
sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS));
|
||||
|
||||
sliderPanel.add(new JLabel("* Hue bins: "));
|
||||
JSlider slider = new JSlider(0, MAX_SLIDER, bins);
|
||||
slider.setMajorTickSpacing(25);
|
||||
slider.setMinorTickSpacing(5);
|
||||
slider.setPaintTicks(true);
|
||||
slider.setPaintLabels(true);
|
||||
slider.addChangeListener(new ChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
JSlider source = (JSlider) e.getSource();
|
||||
bins = source.getValue();
|
||||
update();
|
||||
}
|
||||
});
|
||||
sliderPanel.add(slider);
|
||||
pane.add(sliderPanel, BorderLayout.PAGE_START);
|
||||
//! [Create Trackbar to enter the number of bins]
|
||||
|
||||
JPanel imgPanel = new JPanel();
|
||||
imgLabel = new JLabel(new ImageIcon(img));
|
||||
imgPanel.add(imgLabel);
|
||||
|
||||
backprojLabel = new JLabel();
|
||||
imgPanel.add(backprojLabel);
|
||||
|
||||
histImgLabel = new JLabel();
|
||||
imgPanel.add(histImgLabel);
|
||||
pane.add(imgPanel, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
private void update() {
|
||||
//! [initialize]
|
||||
int histSize = Math.max(bins, 2);
|
||||
float[] hueRange = {0, 180};
|
||||
//! [initialize]
|
||||
|
||||
//! [Get the Histogram and normalize it]
|
||||
Mat hist = new Mat();
|
||||
List<Mat> hueList = Arrays.asList(hue);
|
||||
Imgproc.calcHist(hueList, new MatOfInt(0), new Mat(), hist, new MatOfInt(histSize), new MatOfFloat(hueRange), false);
|
||||
Core.normalize(hist, hist, 0, 255, Core.NORM_MINMAX);
|
||||
//! [Get the Histogram and normalize it]
|
||||
|
||||
//! [Get Backprojection]
|
||||
Mat backproj = new Mat();
|
||||
Imgproc.calcBackProject(hueList, new MatOfInt(0), hist, backproj, new MatOfFloat(hueRange), 1);
|
||||
//! [Get Backprojection]
|
||||
|
||||
//! [Draw the backproj]
|
||||
Image backprojImg = HighGui.toBufferedImage(backproj);
|
||||
backprojLabel.setIcon(new ImageIcon(backprojImg));
|
||||
//! [Draw the backproj]
|
||||
|
||||
//! [Draw the histogram]
|
||||
int w = 400, h = 400;
|
||||
int binW = (int) Math.round((double) w / histSize);
|
||||
histImg = Mat.zeros(h, w, CvType.CV_8UC3);
|
||||
|
||||
float[] histData = new float[(int) (hist.total() * hist.channels())];
|
||||
hist.get(0, 0, histData);
|
||||
for (int i = 0; i < bins; i++) {
|
||||
Imgproc.rectangle(histImg, new Point(i * binW, h),
|
||||
new Point((i + 1) * binW, h - Math.round(histData[i] * h / 255.0)), new Scalar(0, 0, 255), Imgproc.FILLED);
|
||||
}
|
||||
Image histImage = HighGui.toBufferedImage(histImg);
|
||||
histImgLabel.setIcon(new ImageIcon(histImage));
|
||||
//! [Draw the histogram]
|
||||
|
||||
frame.repaint();
|
||||
frame.pack();
|
||||
}
|
||||
}
|
||||
|
||||
public class CalcBackProjectDemo1 {
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
// Schedule a job for the event dispatch thread:
|
||||
// creating and showing this application's GUI.
|
||||
javax.swing.SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
new CalcBackProject1(args);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,189 @@
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Container;
|
||||
import java.awt.Image;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSlider;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.CvType;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfFloat;
|
||||
import org.opencv.core.MatOfInt;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.core.Range;
|
||||
import org.opencv.core.Rect;
|
||||
import org.opencv.core.Scalar;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class CalcBackProject2 {
|
||||
private Mat src;
|
||||
private Mat hsv = new Mat();
|
||||
private Mat mask = new Mat();
|
||||
private JFrame frame;
|
||||
private JLabel imgLabel;
|
||||
private JLabel backprojLabel;
|
||||
private JLabel maskImgLabel;
|
||||
private static final int MAX_SLIDER = 255;
|
||||
private int low = 20;
|
||||
private int up = 20;
|
||||
|
||||
public CalcBackProject2(String[] args) {
|
||||
/// Read the image
|
||||
if (args.length != 1) {
|
||||
System.err.println("You must supply one argument that corresponds to the path to the image.");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
src = Imgcodecs.imread(args[0]);
|
||||
if (src.empty()) {
|
||||
System.err.println("Empty image: " + args[0]);
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
/// Transform it to HSV
|
||||
Imgproc.cvtColor(src, hsv, Imgproc.COLOR_BGR2HSV);
|
||||
|
||||
// Create and set up the window.
|
||||
frame = new JFrame("Back Projection 2 demo");
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
// Set up the content pane.
|
||||
Image img = HighGui.toBufferedImage(src);
|
||||
addComponentsToPane(frame.getContentPane(), img);
|
||||
// Use the content pane's default BorderLayout. No need for
|
||||
// setLayout(new BorderLayout());
|
||||
// Display the window.
|
||||
frame.pack();
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
private void addComponentsToPane(Container pane, Image img) {
|
||||
if (!(pane.getLayout() instanceof BorderLayout)) {
|
||||
pane.add(new JLabel("Container doesn't use BorderLayout!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/// Set Trackbars for floodfill thresholds
|
||||
JPanel sliderPanel = new JPanel();
|
||||
sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS));
|
||||
|
||||
sliderPanel.add(new JLabel("Low thresh"));
|
||||
JSlider slider = new JSlider(0, MAX_SLIDER, low);
|
||||
slider.setMajorTickSpacing(20);
|
||||
slider.setMinorTickSpacing(10);
|
||||
slider.setPaintTicks(true);
|
||||
slider.setPaintLabels(true);
|
||||
slider.addChangeListener(new ChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
JSlider source = (JSlider) e.getSource();
|
||||
low = source.getValue();
|
||||
}
|
||||
});
|
||||
sliderPanel.add(slider);
|
||||
pane.add(sliderPanel, BorderLayout.PAGE_START);
|
||||
|
||||
sliderPanel.add(new JLabel("High thresh"));
|
||||
slider = new JSlider(0, MAX_SLIDER, up);
|
||||
slider.setMajorTickSpacing(20);
|
||||
slider.setMinorTickSpacing(10);
|
||||
slider.setPaintTicks(true);
|
||||
slider.setPaintLabels(true);
|
||||
slider.addChangeListener(new ChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
JSlider source = (JSlider) e.getSource();
|
||||
up = source.getValue();
|
||||
}
|
||||
});
|
||||
sliderPanel.add(slider);
|
||||
pane.add(sliderPanel, BorderLayout.PAGE_START);
|
||||
|
||||
JPanel imgPanel = new JPanel();
|
||||
imgLabel = new JLabel(new ImageIcon(img));
|
||||
/// Set a Mouse Callback
|
||||
imgLabel.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
update(e.getX(), e.getY());
|
||||
}
|
||||
});
|
||||
imgPanel.add(imgLabel);
|
||||
|
||||
maskImgLabel = new JLabel();
|
||||
imgPanel.add(maskImgLabel);
|
||||
|
||||
backprojLabel = new JLabel();
|
||||
imgPanel.add(backprojLabel);
|
||||
|
||||
pane.add(imgPanel, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
private void update(int x, int y) {
|
||||
// Fill and get the mask
|
||||
Point seed = new Point(x, y);
|
||||
|
||||
int newMaskVal = 255;
|
||||
Scalar newVal = new Scalar(120, 120, 120);
|
||||
|
||||
int connectivity = 8;
|
||||
int flags = connectivity + (newMaskVal << 8) + Imgproc.FLOODFILL_FIXED_RANGE + Imgproc.FLOODFILL_MASK_ONLY;
|
||||
|
||||
Mat mask2 = Mat.zeros(src.rows() + 2, src.cols() + 2, CvType.CV_8U);
|
||||
Imgproc.floodFill(src, mask2, seed, newVal, new Rect(), new Scalar(low, low, low), new Scalar(up, up, up), flags);
|
||||
mask = mask2.submat(new Range(1, mask2.rows() - 1), new Range(1, mask2.cols() - 1));
|
||||
|
||||
Image maskImg = HighGui.toBufferedImage(mask);
|
||||
maskImgLabel.setIcon(new ImageIcon(maskImg));
|
||||
|
||||
int hBins = 30, sBins = 32;
|
||||
int[] histSize = { hBins, sBins };
|
||||
float[] ranges = { 0, 180, 0, 256 };
|
||||
int[] channels = { 0, 1 };
|
||||
|
||||
/// Get the Histogram and normalize it
|
||||
Mat hist = new Mat();
|
||||
List<Mat> hsvList = Arrays.asList(hsv);
|
||||
Imgproc.calcHist(hsvList, new MatOfInt(channels), mask, hist, new MatOfInt(histSize), new MatOfFloat(ranges), false );
|
||||
|
||||
Core.normalize(hist, hist, 0, 255, Core.NORM_MINMAX);
|
||||
|
||||
/// Get Backprojection
|
||||
Mat backproj = new Mat();
|
||||
Imgproc.calcBackProject(hsvList, new MatOfInt(channels), hist, backproj, new MatOfFloat(ranges), 1);
|
||||
|
||||
Image backprojImg = HighGui.toBufferedImage(backproj);
|
||||
backprojLabel.setIcon(new ImageIcon(backprojImg));
|
||||
|
||||
frame.repaint();
|
||||
frame.pack();
|
||||
}
|
||||
}
|
||||
|
||||
public class CalcBackProjectDemo2 {
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
// Schedule a job for the event dispatch thread:
|
||||
// creating and showing this application's GUI.
|
||||
javax.swing.SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
new CalcBackProject2(args);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,99 @@
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.CvType;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfFloat;
|
||||
import org.opencv.core.MatOfInt;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.core.Scalar;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class CalcHist {
|
||||
public void run(String[] args) {
|
||||
//! [Load image]
|
||||
String filename = args.length > 0 ? args[0] : "../data/lena.jpg";
|
||||
Mat src = Imgcodecs.imread(filename);
|
||||
if (src.empty()) {
|
||||
System.err.println("Cannot read image: " + filename);
|
||||
System.exit(0);
|
||||
}
|
||||
//! [Load image]
|
||||
|
||||
//! [Separate the image in 3 places ( B, G and R )]
|
||||
List<Mat> bgrPlanes = new ArrayList<>();
|
||||
Core.split(src, bgrPlanes);
|
||||
//! [Separate the image in 3 places ( B, G and R )]
|
||||
|
||||
//! [Establish the number of bins]
|
||||
int histSize = 256;
|
||||
//! [Establish the number of bins]
|
||||
|
||||
//! [Set the ranges ( for B,G,R) )]
|
||||
float[] range = {0, 256}; //the upper boundary is exclusive
|
||||
MatOfFloat histRange = new MatOfFloat(range);
|
||||
//! [Set the ranges ( for B,G,R) )]
|
||||
|
||||
//! [Set histogram param]
|
||||
boolean accumulate = false;
|
||||
//! [Set histogram param]
|
||||
|
||||
//! [Compute the histograms]
|
||||
Mat bHist = new Mat(), gHist = new Mat(), rHist = new Mat();
|
||||
Imgproc.calcHist(bgrPlanes, new MatOfInt(0), new Mat(), bHist, new MatOfInt(histSize), histRange, accumulate);
|
||||
Imgproc.calcHist(bgrPlanes, new MatOfInt(1), new Mat(), gHist, new MatOfInt(histSize), histRange, accumulate);
|
||||
Imgproc.calcHist(bgrPlanes, new MatOfInt(2), new Mat(), rHist, new MatOfInt(histSize), histRange, accumulate);
|
||||
//! [Compute the histograms]
|
||||
|
||||
//! [Draw the histograms for B, G and R]
|
||||
int histW = 512, histH = 400;
|
||||
int binW = (int) Math.round((double) histW / histSize);
|
||||
|
||||
Mat histImage = new Mat( histH, histW, CvType.CV_8UC3, new Scalar( 0,0,0) );
|
||||
//! [Draw the histograms for B, G and R]
|
||||
|
||||
//! [Normalize the result to ( 0, histImage.rows )]
|
||||
Core.normalize(bHist, bHist, 0, histImage.rows(), Core.NORM_MINMAX);
|
||||
Core.normalize(gHist, gHist, 0, histImage.rows(), Core.NORM_MINMAX);
|
||||
Core.normalize(rHist, rHist, 0, histImage.rows(), Core.NORM_MINMAX);
|
||||
//! [Normalize the result to ( 0, histImage.rows )]
|
||||
|
||||
//! [Draw for each channel]
|
||||
float[] bHistData = new float[(int) (bHist.total() * bHist.channels())];
|
||||
bHist.get(0, 0, bHistData);
|
||||
float[] gHistData = new float[(int) (gHist.total() * gHist.channels())];
|
||||
gHist.get(0, 0, gHistData);
|
||||
float[] rHistData = new float[(int) (rHist.total() * rHist.channels())];
|
||||
rHist.get(0, 0, rHistData);
|
||||
|
||||
for( int i = 1; i < histSize; i++ ) {
|
||||
Imgproc.line(histImage, new Point(binW * (i - 1), histH - Math.round(bHistData[i - 1])),
|
||||
new Point(binW * (i), histH - Math.round(bHistData[i])), new Scalar(255, 0, 0), 2);
|
||||
Imgproc.line(histImage, new Point(binW * (i - 1), histH - Math.round(gHistData[i - 1])),
|
||||
new Point(binW * (i), histH - Math.round(gHistData[i])), new Scalar(0, 255, 0), 2);
|
||||
Imgproc.line(histImage, new Point(binW * (i - 1), histH - Math.round(rHistData[i - 1])),
|
||||
new Point(binW * (i), histH - Math.round(rHistData[i])), new Scalar(0, 0, 255), 2);
|
||||
}
|
||||
//! [Draw for each channel]
|
||||
|
||||
//! [Display]
|
||||
HighGui.imshow( "Source image", src );
|
||||
HighGui.imshow( "calcHist Demo", histImage );
|
||||
HighGui.waitKey(0);
|
||||
//! [Display]
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class CalcHistDemo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
new CalcHist().run(args);
|
||||
}
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfFloat;
|
||||
import org.opencv.core.MatOfInt;
|
||||
import org.opencv.core.Range;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class CompareHist {
|
||||
public void run(String[] args) {
|
||||
//! [Load three images with different environment settings]
|
||||
if (args.length != 3) {
|
||||
System.err.println("You must supply 3 arguments that correspond to the paths to 3 images.");
|
||||
System.exit(0);
|
||||
}
|
||||
Mat srcBase = Imgcodecs.imread(args[0]);
|
||||
Mat srcTest1 = Imgcodecs.imread(args[1]);
|
||||
Mat srcTest2 = Imgcodecs.imread(args[2]);
|
||||
if (srcBase.empty() || srcTest1.empty() || srcTest2.empty()) {
|
||||
System.err.println("Cannot read the images");
|
||||
System.exit(0);
|
||||
}
|
||||
//! [Load three images with different environment settings]
|
||||
|
||||
//! [Convert to HSV]
|
||||
Mat hsvBase = new Mat(), hsvTest1 = new Mat(), hsvTest2 = new Mat();
|
||||
Imgproc.cvtColor( srcBase, hsvBase, Imgproc.COLOR_BGR2HSV );
|
||||
Imgproc.cvtColor( srcTest1, hsvTest1, Imgproc.COLOR_BGR2HSV );
|
||||
Imgproc.cvtColor( srcTest2, hsvTest2, Imgproc.COLOR_BGR2HSV );
|
||||
//! [Convert to HSV]
|
||||
|
||||
//! [Convert to HSV half]
|
||||
Mat hsvHalfDown = hsvBase.submat( new Range( hsvBase.rows()/2, hsvBase.rows() - 1 ), new Range( 0, hsvBase.cols() - 1 ) );
|
||||
//! [Convert to HSV half]
|
||||
|
||||
//! [Using 50 bins for hue and 60 for saturation]
|
||||
int hBins = 50, sBins = 60;
|
||||
int[] histSize = { hBins, sBins };
|
||||
|
||||
// hue varies from 0 to 179, saturation from 0 to 255
|
||||
float[] ranges = { 0, 180, 0, 256 };
|
||||
|
||||
// Use the 0-th and 1-st channels
|
||||
int[] channels = { 0, 1 };
|
||||
//! [Using 50 bins for hue and 60 for saturation]
|
||||
|
||||
//! [Calculate the histograms for the HSV images]
|
||||
Mat histBase = new Mat(), histHalfDown = new Mat(), histTest1 = new Mat(), histTest2 = new Mat();
|
||||
|
||||
List<Mat> hsvBaseList = Arrays.asList(hsvBase);
|
||||
Imgproc.calcHist(hsvBaseList, new MatOfInt(channels), new Mat(), histBase, new MatOfInt(histSize), new MatOfFloat(ranges), false);
|
||||
Core.normalize(histBase, histBase, 0, 1, Core.NORM_MINMAX);
|
||||
|
||||
List<Mat> hsvHalfDownList = Arrays.asList(hsvHalfDown);
|
||||
Imgproc.calcHist(hsvHalfDownList, new MatOfInt(channels), new Mat(), histHalfDown, new MatOfInt(histSize), new MatOfFloat(ranges), false);
|
||||
Core.normalize(histHalfDown, histHalfDown, 0, 1, Core.NORM_MINMAX);
|
||||
|
||||
List<Mat> hsvTest1List = Arrays.asList(hsvTest1);
|
||||
Imgproc.calcHist(hsvTest1List, new MatOfInt(channels), new Mat(), histTest1, new MatOfInt(histSize), new MatOfFloat(ranges), false);
|
||||
Core.normalize(histTest1, histTest1, 0, 1, Core.NORM_MINMAX);
|
||||
|
||||
List<Mat> hsvTest2List = Arrays.asList(hsvTest2);
|
||||
Imgproc.calcHist(hsvTest2List, new MatOfInt(channels), new Mat(), histTest2, new MatOfInt(histSize), new MatOfFloat(ranges), false);
|
||||
Core.normalize(histTest2, histTest2, 0, 1, Core.NORM_MINMAX);
|
||||
//! [Calculate the histograms for the HSV images]
|
||||
|
||||
//! [Apply the histogram comparison methods]
|
||||
for( int compareMethod = 0; compareMethod < 4; compareMethod++ ) {
|
||||
double baseBase = Imgproc.compareHist( histBase, histBase, compareMethod );
|
||||
double baseHalf = Imgproc.compareHist( histBase, histHalfDown, compareMethod );
|
||||
double baseTest1 = Imgproc.compareHist( histBase, histTest1, compareMethod );
|
||||
double baseTest2 = Imgproc.compareHist( histBase, histTest2, compareMethod );
|
||||
|
||||
System.out.println("Method " + compareMethod + " Perfect, Base-Half, Base-Test(1), Base-Test(2) : " + baseBase + " / " + baseHalf
|
||||
+ " / " + baseTest1 + " / " + baseTest2);
|
||||
}
|
||||
//! [Apply the histogram comparison methods]
|
||||
}
|
||||
}
|
||||
|
||||
public class CompareHistDemo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
new CompareHist().run(args);
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class EqualizeHist {
|
||||
public void run(String[] args) {
|
||||
//! [Load image]
|
||||
String filename = args.length > 0 ? args[0] : "../data/lena.jpg";
|
||||
Mat src = Imgcodecs.imread(filename);
|
||||
if (src.empty()) {
|
||||
System.err.println("Cannot read image: " + filename);
|
||||
System.exit(0);
|
||||
}
|
||||
//! [Load image]
|
||||
|
||||
//! [Convert to grayscale]
|
||||
Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);
|
||||
//! [Convert to grayscale]
|
||||
|
||||
//! [Apply Histogram Equalization]
|
||||
Mat dst = new Mat();
|
||||
Imgproc.equalizeHist( src, dst );
|
||||
//! [Apply Histogram Equalization]
|
||||
|
||||
//! [Display results]
|
||||
HighGui.imshow( "Source image", src );
|
||||
HighGui.imshow( "Equalized Image", dst );
|
||||
//! [Display results]
|
||||
|
||||
//! [Wait until user exits the program]
|
||||
HighGui.waitKey(0);
|
||||
//! [Wait until user exits the program]
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class EqualizeHistDemo {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
new EqualizeHist().run(args);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user