feat: 切换后端至PaddleOCR-NCNN,切换工程为CMake
1.项目后端整体迁移至PaddleOCR-NCNN算法,已通过基本的兼容性测试 2.工程改为使用CMake组织,后续为了更好地兼容第三方库,不再提供QMake工程 3.重整权利声明文件,重整代码工程,确保最小化侵权风险 Log: 切换后端至PaddleOCR-NCNN,切换工程为CMake Change-Id: I4d5d2c5d37505a4a24b389b1a4c5d12f17bfa38c
This commit is contained in:
81
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java
vendored
Normal file
81
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/Filter2D/Filter2D_Demo.java
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
/**
|
||||
* @file Filter2D_demo.java
|
||||
* @brief Sample code that shows how to implement your own linear filters by using filter2D function
|
||||
*/
|
||||
|
||||
import org.opencv.core.*;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class Filter2D_DemoRun {
|
||||
|
||||
public void run(String[] args) {
|
||||
// Declare variables
|
||||
Mat src, dst = new Mat();
|
||||
|
||||
Mat kernel = new Mat();
|
||||
Point anchor;
|
||||
double delta;
|
||||
int ddepth;
|
||||
int kernel_size;
|
||||
String window_name = "filter2D Demo";
|
||||
|
||||
//! [load]
|
||||
String imageName = ((args.length > 0) ? args[0] : "../data/lena.jpg");
|
||||
|
||||
// Load an image
|
||||
src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR);
|
||||
|
||||
// Check if image is loaded fine
|
||||
if( src.empty() ) {
|
||||
System.out.println("Error opening image!");
|
||||
System.out.println("Program Arguments: [image_name -- default ../data/lena.jpg] \n");
|
||||
System.exit(-1);
|
||||
}
|
||||
//! [load]
|
||||
|
||||
//! [init_arguments]
|
||||
// Initialize arguments for the filter
|
||||
anchor = new Point( -1, -1);
|
||||
delta = 0.0;
|
||||
ddepth = -1;
|
||||
//! [init_arguments]
|
||||
|
||||
// Loop - Will filter the image with different kernel sizes each 0.5 seconds
|
||||
int ind = 0;
|
||||
while( true )
|
||||
{
|
||||
//! [update_kernel]
|
||||
// Update kernel size for a normalized box filter
|
||||
kernel_size = 3 + 2*( ind%5 );
|
||||
Mat ones = Mat.ones( kernel_size, kernel_size, CvType.CV_32F );
|
||||
Core.multiply(ones, new Scalar(1/(double)(kernel_size*kernel_size)), kernel);
|
||||
//! [update_kernel]
|
||||
|
||||
//! [apply_filter]
|
||||
// Apply filter
|
||||
Imgproc.filter2D(src, dst, ddepth , kernel, anchor, delta, Core.BORDER_DEFAULT );
|
||||
//! [apply_filter]
|
||||
HighGui.imshow( window_name, dst );
|
||||
|
||||
int c = HighGui.waitKey(500);
|
||||
// Press 'ESC' to exit the program
|
||||
if( c == 27 )
|
||||
{ break; }
|
||||
|
||||
ind++;
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class Filter2D_Demo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native library.
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
new Filter2D_DemoRun().run(args);
|
||||
}
|
||||
}
|
77
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java
vendored
Normal file
77
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/HoughCircle/HoughCircles.java
vendored
Normal file
@ -0,0 +1,77 @@
|
||||
package sample;
|
||||
/**
|
||||
* @file HoughCircles.java
|
||||
* @brief This program demonstrates circle finding with the Hough transform
|
||||
*/
|
||||
|
||||
import org.opencv.core.*;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class HoughCirclesRun {
|
||||
|
||||
public void run(String[] args) {
|
||||
|
||||
//! [load]
|
||||
String default_file = "../../../../data/smarties.png";
|
||||
String filename = ((args.length > 0) ? args[0] : default_file);
|
||||
|
||||
// Load an image
|
||||
Mat src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_COLOR);
|
||||
|
||||
// Check if image is loaded fine
|
||||
if( src.empty() ) {
|
||||
System.out.println("Error opening image!");
|
||||
System.out.println("Program Arguments: [image_name -- default "
|
||||
+ default_file +"] \n");
|
||||
System.exit(-1);
|
||||
}
|
||||
//! [load]
|
||||
|
||||
//! [convert_to_gray]
|
||||
Mat gray = new Mat();
|
||||
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
|
||||
//! [convert_to_gray]
|
||||
|
||||
//![reduce_noise]
|
||||
Imgproc.medianBlur(gray, gray, 5);
|
||||
//![reduce_noise]
|
||||
|
||||
//! [houghcircles]
|
||||
Mat circles = new Mat();
|
||||
Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1.0,
|
||||
(double)gray.rows()/16, // change this value to detect circles with different distances to each other
|
||||
100.0, 30.0, 1, 30); // change the last two parameters
|
||||
// (min_radius & max_radius) to detect larger circles
|
||||
//! [houghcircles]
|
||||
|
||||
//! [draw]
|
||||
for (int x = 0; x < circles.cols(); x++) {
|
||||
double[] c = circles.get(0, x);
|
||||
Point center = new Point(Math.round(c[0]), Math.round(c[1]));
|
||||
// circle center
|
||||
Imgproc.circle(src, center, 1, new Scalar(0,100,100), 3, 8, 0 );
|
||||
// circle outline
|
||||
int radius = (int) Math.round(c[2]);
|
||||
Imgproc.circle(src, center, radius, new Scalar(255,0,255), 3, 8, 0 );
|
||||
}
|
||||
//! [draw]
|
||||
|
||||
//! [display]
|
||||
HighGui.imshow("detected circles", src);
|
||||
HighGui.waitKey();
|
||||
//! [display]
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class HoughCircles {
|
||||
public static void main(String[] args) {
|
||||
// Load the native library.
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
new HoughCirclesRun().run(args);
|
||||
}
|
||||
}
|
96
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java
vendored
Normal file
96
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/HoughLine/HoughLines.java
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
/**
|
||||
* @file HoughLines.java
|
||||
* @brief This program demonstrates line finding with the Hough transform
|
||||
*/
|
||||
|
||||
import org.opencv.core.*;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class HoughLinesRun {
|
||||
|
||||
public void run(String[] args) {
|
||||
// Declare the output variables
|
||||
Mat dst = new Mat(), cdst = new Mat(), cdstP;
|
||||
|
||||
//! [load]
|
||||
String default_file = "../../../../data/sudoku.png";
|
||||
String filename = ((args.length > 0) ? args[0] : default_file);
|
||||
|
||||
// Load an image
|
||||
Mat src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_GRAYSCALE);
|
||||
|
||||
// Check if image is loaded fine
|
||||
if( src.empty() ) {
|
||||
System.out.println("Error opening image!");
|
||||
System.out.println("Program Arguments: [image_name -- default "
|
||||
+ default_file +"] \n");
|
||||
System.exit(-1);
|
||||
}
|
||||
//! [load]
|
||||
|
||||
//! [edge_detection]
|
||||
// Edge detection
|
||||
Imgproc.Canny(src, dst, 50, 200, 3, false);
|
||||
//! [edge_detection]
|
||||
|
||||
// Copy edges to the images that will display the results in BGR
|
||||
Imgproc.cvtColor(dst, cdst, Imgproc.COLOR_GRAY2BGR);
|
||||
cdstP = cdst.clone();
|
||||
|
||||
//! [hough_lines]
|
||||
// Standard Hough Line Transform
|
||||
Mat lines = new Mat(); // will hold the results of the detection
|
||||
Imgproc.HoughLines(dst, lines, 1, Math.PI/180, 150); // runs the actual detection
|
||||
//! [hough_lines]
|
||||
//! [draw_lines]
|
||||
// Draw the lines
|
||||
for (int x = 0; x < lines.rows(); x++) {
|
||||
double rho = lines.get(x, 0)[0],
|
||||
theta = lines.get(x, 0)[1];
|
||||
|
||||
double a = Math.cos(theta), b = Math.sin(theta);
|
||||
double x0 = a*rho, y0 = b*rho;
|
||||
Point pt1 = new Point(Math.round(x0 + 1000*(-b)), Math.round(y0 + 1000*(a)));
|
||||
Point pt2 = new Point(Math.round(x0 - 1000*(-b)), Math.round(y0 - 1000*(a)));
|
||||
Imgproc.line(cdst, pt1, pt2, new Scalar(0, 0, 255), 3, Imgproc.LINE_AA, 0);
|
||||
}
|
||||
//! [draw_lines]
|
||||
|
||||
//! [hough_lines_p]
|
||||
// Probabilistic Line Transform
|
||||
Mat linesP = new Mat(); // will hold the results of the detection
|
||||
Imgproc.HoughLinesP(dst, linesP, 1, Math.PI/180, 50, 50, 10); // runs the actual detection
|
||||
//! [hough_lines_p]
|
||||
//! [draw_lines_p]
|
||||
// Draw the lines
|
||||
for (int x = 0; x < linesP.rows(); x++) {
|
||||
double[] l = linesP.get(x, 0);
|
||||
Imgproc.line(cdstP, new Point(l[0], l[1]), new Point(l[2], l[3]), new Scalar(0, 0, 255), 3, Imgproc.LINE_AA, 0);
|
||||
}
|
||||
//! [draw_lines_p]
|
||||
|
||||
//! [imshow]
|
||||
// Show results
|
||||
HighGui.imshow("Source", src);
|
||||
HighGui.imshow("Detected Lines (in red) - Standard Hough Line Transform", cdst);
|
||||
HighGui.imshow("Detected Lines (in red) - Probabilistic Line Transform", cdstP);
|
||||
//! [imshow]
|
||||
|
||||
//! [exit]
|
||||
// Wait and Exit
|
||||
HighGui.waitKey();
|
||||
System.exit(0);
|
||||
//! [exit]
|
||||
}
|
||||
}
|
||||
|
||||
public class HoughLines {
|
||||
public static void main(String[] args) {
|
||||
// Load the native library.
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
new HoughLinesRun().run(args);
|
||||
}
|
||||
}
|
73
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java
vendored
Normal file
73
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
/**
|
||||
* @file LaplaceDemo.java
|
||||
* @brief Sample code showing how to detect edges using the Laplace operator
|
||||
*/
|
||||
|
||||
import org.opencv.core.*;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class LaplaceDemoRun {
|
||||
|
||||
public void run(String[] args) {
|
||||
//! [variables]
|
||||
// Declare the variables we are going to use
|
||||
Mat src, src_gray = new Mat(), dst = new Mat();
|
||||
int kernel_size = 3;
|
||||
int scale = 1;
|
||||
int delta = 0;
|
||||
int ddepth = CvType.CV_16S;
|
||||
String window_name = "Laplace Demo";
|
||||
//! [variables]
|
||||
|
||||
//! [load]
|
||||
String imageName = ((args.length > 0) ? args[0] : "../data/lena.jpg");
|
||||
|
||||
src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR); // Load an image
|
||||
|
||||
// Check if image is loaded fine
|
||||
if( src.empty() ) {
|
||||
System.out.println("Error opening image");
|
||||
System.out.println("Program Arguments: [image_name -- default ../data/lena.jpg] \n");
|
||||
System.exit(-1);
|
||||
}
|
||||
//! [load]
|
||||
|
||||
//! [reduce_noise]
|
||||
// Reduce noise by blurring with a Gaussian filter ( kernel size = 3 )
|
||||
Imgproc.GaussianBlur( src, src, new Size(3, 3), 0, 0, Core.BORDER_DEFAULT );
|
||||
//! [reduce_noise]
|
||||
|
||||
//! [convert_to_gray]
|
||||
// Convert the image to grayscale
|
||||
Imgproc.cvtColor( src, src_gray, Imgproc.COLOR_RGB2GRAY );
|
||||
//! [convert_to_gray]
|
||||
|
||||
/// Apply Laplace function
|
||||
Mat abs_dst = new Mat();
|
||||
//! [laplacian]
|
||||
Imgproc.Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT );
|
||||
//! [laplacian]
|
||||
|
||||
//! [convert]
|
||||
// converting back to CV_8U
|
||||
Core.convertScaleAbs( dst, abs_dst );
|
||||
//! [convert]
|
||||
|
||||
//! [display]
|
||||
HighGui.imshow( window_name, abs_dst );
|
||||
HighGui.waitKey(0);
|
||||
//! [display]
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class LaplaceDemo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native library.
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
new LaplaceDemoRun().run(args);
|
||||
}
|
||||
}
|
94
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java
vendored
Normal file
94
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
/**
|
||||
* @file CopyMakeBorder.java
|
||||
* @brief Sample code that shows the functionality of copyMakeBorder
|
||||
*/
|
||||
|
||||
import org.opencv.core.*;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
class CopyMakeBorderRun {
|
||||
|
||||
public void run(String[] args) {
|
||||
|
||||
//! [variables]
|
||||
// Declare the variables
|
||||
Mat src, dst = new Mat();
|
||||
int top, bottom, left, right;
|
||||
int borderType = Core.BORDER_CONSTANT;
|
||||
String window_name = "copyMakeBorder Demo";
|
||||
Random rng;
|
||||
//! [variables]
|
||||
|
||||
//! [load]
|
||||
String imageName = ((args.length > 0) ? args[0] : "../data/lena.jpg");
|
||||
|
||||
// Load an image
|
||||
src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR);
|
||||
|
||||
// Check if image is loaded fine
|
||||
if( src.empty() ) {
|
||||
System.out.println("Error opening image!");
|
||||
System.out.println("Program Arguments: [image_name -- default ../data/lena.jpg] \n");
|
||||
System.exit(-1);
|
||||
}
|
||||
//! [load]
|
||||
|
||||
// Brief how-to for this program
|
||||
System.out.println("\n" +
|
||||
"\t copyMakeBorder Demo: \n" +
|
||||
"\t -------------------- \n" +
|
||||
" ** Press 'c' to set the border to a random constant value \n" +
|
||||
" ** Press 'r' to set the border to be replicated \n" +
|
||||
" ** Press 'ESC' to exit the program \n");
|
||||
|
||||
//![create_window]
|
||||
HighGui.namedWindow( window_name, HighGui.WINDOW_AUTOSIZE );
|
||||
//![create_window]
|
||||
|
||||
//! [init_arguments]
|
||||
// Initialize arguments for the filter
|
||||
top = (int) (0.05*src.rows()); bottom = top;
|
||||
left = (int) (0.05*src.cols()); right = left;
|
||||
//! [init_arguments]
|
||||
|
||||
while( true ) {
|
||||
//! [update_value]
|
||||
rng = new Random();
|
||||
Scalar value = new Scalar( rng.nextInt(256),
|
||||
rng.nextInt(256), rng.nextInt(256) );
|
||||
//! [update_value]
|
||||
|
||||
//! [copymakeborder]
|
||||
Core.copyMakeBorder( src, dst, top, bottom, left, right, borderType, value);
|
||||
//! [copymakeborder]
|
||||
//! [display]
|
||||
HighGui.imshow( window_name, dst );
|
||||
//! [display]
|
||||
|
||||
//![check_keypress]
|
||||
char c = (char) HighGui.waitKey(500);
|
||||
c = Character.toLowerCase(c);
|
||||
|
||||
if( c == 27 )
|
||||
{ break; }
|
||||
else if( c == 'c' )
|
||||
{ borderType = Core.BORDER_CONSTANT;}
|
||||
else if( c == 'r' )
|
||||
{ borderType = Core.BORDER_REPLICATE;}
|
||||
//![check_keypress]
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class CopyMakeBorder {
|
||||
public static void main(String[] args) {
|
||||
// Load the native library.
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
new CopyMakeBorderRun().run(args);
|
||||
}
|
||||
}
|
94
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java
vendored
Normal file
94
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/SobelDemo/SobelDemo.java
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
/**
|
||||
* @file SobelDemo.java
|
||||
* @brief Sample code using Sobel and/or Scharr OpenCV functions to make a simple Edge Detector
|
||||
*/
|
||||
|
||||
import org.opencv.core.*;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class SobelDemoRun {
|
||||
|
||||
public void run(String[] args) {
|
||||
|
||||
//! [declare_variables]
|
||||
// First we declare the variables we are going to use
|
||||
Mat src, src_gray = new Mat();
|
||||
Mat grad = new Mat();
|
||||
String window_name = "Sobel Demo - Simple Edge Detector";
|
||||
int scale = 1;
|
||||
int delta = 0;
|
||||
int ddepth = CvType.CV_16S;
|
||||
//! [declare_variables]
|
||||
|
||||
//! [load]
|
||||
// As usual we load our source image (src)
|
||||
// Check number of arguments
|
||||
if (args.length == 0){
|
||||
System.out.println("Not enough parameters!");
|
||||
System.out.println("Program Arguments: [image_path]");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
// Load the image
|
||||
src = Imgcodecs.imread(args[0]);
|
||||
|
||||
// Check if image is loaded fine
|
||||
if( src.empty() ) {
|
||||
System.out.println("Error opening image: " + args[0]);
|
||||
System.exit(-1);
|
||||
}
|
||||
//! [load]
|
||||
|
||||
//! [reduce_noise]
|
||||
// Remove noise by blurring with a Gaussian filter ( kernel size = 3 )
|
||||
Imgproc.GaussianBlur( src, src, new Size(3, 3), 0, 0, Core.BORDER_DEFAULT );
|
||||
//! [reduce_noise]
|
||||
|
||||
//! [convert_to_gray]
|
||||
// Convert the image to grayscale
|
||||
Imgproc.cvtColor( src, src_gray, Imgproc.COLOR_RGB2GRAY );
|
||||
//! [convert_to_gray]
|
||||
|
||||
//! [sobel]
|
||||
/// Generate grad_x and grad_y
|
||||
Mat grad_x = new Mat(), grad_y = new Mat();
|
||||
Mat abs_grad_x = new Mat(), abs_grad_y = new Mat();
|
||||
|
||||
/// Gradient X
|
||||
//Imgproc.Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, Core.BORDER_DEFAULT );
|
||||
Imgproc.Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, Core.BORDER_DEFAULT );
|
||||
|
||||
/// Gradient Y
|
||||
//Imgproc.Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, Core.BORDER_DEFAULT );
|
||||
Imgproc.Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, Core.BORDER_DEFAULT );
|
||||
//! [sobel]
|
||||
|
||||
//![convert]
|
||||
// converting back to CV_8U
|
||||
Core.convertScaleAbs( grad_x, abs_grad_x );
|
||||
Core.convertScaleAbs( grad_y, abs_grad_y );
|
||||
//![convert]
|
||||
|
||||
//! [add_weighted]
|
||||
/// Total Gradient (approximate)
|
||||
Core.addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
|
||||
//! [add_weighted]
|
||||
|
||||
//! [display]
|
||||
HighGui.imshow( window_name, grad );
|
||||
HighGui.waitKey(0);
|
||||
//! [display]
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class SobelDemo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native library.
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
new SobelDemoRun().run(args);
|
||||
}
|
||||
}
|
110
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/canny_detector/CannyDetectorDemo.java
vendored
Normal file
110
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/canny_detector/CannyDetectorDemo.java
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Container;
|
||||
import java.awt.Image;
|
||||
|
||||
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.Scalar;
|
||||
import org.opencv.core.Size;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
public class CannyDetectorDemo {
|
||||
private static final int MAX_LOW_THRESHOLD = 100;
|
||||
private static final int RATIO = 3;
|
||||
private static final int KERNEL_SIZE = 3;
|
||||
private static final Size BLUR_SIZE = new Size(3,3);
|
||||
private int lowThresh = 0;
|
||||
private Mat src;
|
||||
private Mat srcBlur = new Mat();
|
||||
private Mat detectedEdges = new Mat();
|
||||
private Mat dst = new Mat();
|
||||
private JFrame frame;
|
||||
private JLabel imgLabel;
|
||||
|
||||
public CannyDetectorDemo(String[] args) {
|
||||
String imagePath = args.length > 0 ? args[0] : "../data/fruits.jpg";
|
||||
src = Imgcodecs.imread(imagePath);
|
||||
if (src.empty()) {
|
||||
System.out.println("Empty image: " + imagePath);
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
// Create and set up the window.
|
||||
frame = new JFrame("Edge Map (Canny detector 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;
|
||||
}
|
||||
|
||||
JPanel sliderPanel = new JPanel();
|
||||
sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS));
|
||||
|
||||
sliderPanel.add(new JLabel("Min Threshold:"));
|
||||
JSlider slider = new JSlider(0, MAX_LOW_THRESHOLD, 0);
|
||||
slider.setMajorTickSpacing(10);
|
||||
slider.setMinorTickSpacing(5);
|
||||
slider.setPaintTicks(true);
|
||||
slider.setPaintLabels(true);
|
||||
slider.addChangeListener(new ChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
JSlider source = (JSlider) e.getSource();
|
||||
lowThresh = source.getValue();
|
||||
update();
|
||||
}
|
||||
});
|
||||
sliderPanel.add(slider);
|
||||
|
||||
pane.add(sliderPanel, BorderLayout.PAGE_START);
|
||||
imgLabel = new JLabel(new ImageIcon(img));
|
||||
pane.add(imgLabel, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
private void update() {
|
||||
Imgproc.blur(src, srcBlur, BLUR_SIZE);
|
||||
Imgproc.Canny(srcBlur, detectedEdges, lowThresh, lowThresh * RATIO, KERNEL_SIZE, false);
|
||||
dst = new Mat(src.size(), CvType.CV_8UC3, Scalar.all(0));
|
||||
src.copyTo(dst, detectedEdges);
|
||||
Image img = HighGui.toBufferedImage(dst);
|
||||
imgLabel.setIcon(new ImageIcon(img));
|
||||
frame.repaint();
|
||||
}
|
||||
|
||||
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 CannyDetectorDemo(args);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,219 @@
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.CvType;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfPoint;
|
||||
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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief Sample code showing how to segment overlapping objects using Laplacian filtering, in addition to Watershed
|
||||
* and Distance Transformation
|
||||
*
|
||||
*/
|
||||
class ImageSegmentation {
|
||||
public void run(String[] args) {
|
||||
//! [load_image]
|
||||
// Load the image
|
||||
String filename = args.length > 0 ? args[0] : "../data/cards.png";
|
||||
Mat srcOriginal = Imgcodecs.imread(filename);
|
||||
if (srcOriginal.empty()) {
|
||||
System.err.println("Cannot read image: " + filename);
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
// Show source image
|
||||
HighGui.imshow("Source Image", srcOriginal);
|
||||
//! [load_image]
|
||||
|
||||
//! [black_bg]
|
||||
// Change the background from white to black, since that will help later to
|
||||
// extract
|
||||
// better results during the use of Distance Transform
|
||||
Mat src = srcOriginal.clone();
|
||||
byte[] srcData = new byte[(int) (src.total() * src.channels())];
|
||||
src.get(0, 0, srcData);
|
||||
for (int i = 0; i < src.rows(); i++) {
|
||||
for (int j = 0; j < src.cols(); j++) {
|
||||
if (srcData[(i * src.cols() + j) * 3] == (byte) 255 && srcData[(i * src.cols() + j) * 3 + 1] == (byte) 255
|
||||
&& srcData[(i * src.cols() + j) * 3 + 2] == (byte) 255) {
|
||||
srcData[(i * src.cols() + j) * 3] = 0;
|
||||
srcData[(i * src.cols() + j) * 3 + 1] = 0;
|
||||
srcData[(i * src.cols() + j) * 3 + 2] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
src.put(0, 0, srcData);
|
||||
|
||||
// Show output image
|
||||
HighGui.imshow("Black Background Image", src);
|
||||
//! [black_bg]
|
||||
|
||||
//! [sharp]
|
||||
// Create a kernel that we will use to sharpen our image
|
||||
Mat kernel = new Mat(3, 3, CvType.CV_32F);
|
||||
// an approximation of second derivative, a quite strong kernel
|
||||
float[] kernelData = new float[(int) (kernel.total() * kernel.channels())];
|
||||
kernelData[0] = 1; kernelData[1] = 1; kernelData[2] = 1;
|
||||
kernelData[3] = 1; kernelData[4] = -8; kernelData[5] = 1;
|
||||
kernelData[6] = 1; kernelData[7] = 1; kernelData[8] = 1;
|
||||
kernel.put(0, 0, kernelData);
|
||||
|
||||
// do the laplacian filtering as it is
|
||||
// well, we need to convert everything in something more deeper then CV_8U
|
||||
// because the kernel has some negative values,
|
||||
// and we can expect in general to have a Laplacian image with negative values
|
||||
// BUT a 8bits unsigned int (the one we are working with) can contain values
|
||||
// from 0 to 255
|
||||
// so the possible negative number will be truncated
|
||||
Mat imgLaplacian = new Mat();
|
||||
Imgproc.filter2D(src, imgLaplacian, CvType.CV_32F, kernel);
|
||||
Mat sharp = new Mat();
|
||||
src.convertTo(sharp, CvType.CV_32F);
|
||||
Mat imgResult = new Mat();
|
||||
Core.subtract(sharp, imgLaplacian, imgResult);
|
||||
|
||||
// convert back to 8bits gray scale
|
||||
imgResult.convertTo(imgResult, CvType.CV_8UC3);
|
||||
imgLaplacian.convertTo(imgLaplacian, CvType.CV_8UC3);
|
||||
|
||||
// imshow( "Laplace Filtered Image", imgLaplacian );
|
||||
HighGui.imshow("New Sharped Image", imgResult);
|
||||
//! [sharp]
|
||||
|
||||
//! [bin]
|
||||
// Create binary image from source image
|
||||
Mat bw = new Mat();
|
||||
Imgproc.cvtColor(imgResult, bw, Imgproc.COLOR_BGR2GRAY);
|
||||
Imgproc.threshold(bw, bw, 40, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);
|
||||
HighGui.imshow("Binary Image", bw);
|
||||
//! [bin]
|
||||
|
||||
//! [dist]
|
||||
// Perform the distance transform algorithm
|
||||
Mat dist = new Mat();
|
||||
Imgproc.distanceTransform(bw, dist, Imgproc.DIST_L2, 3);
|
||||
|
||||
// Normalize the distance image for range = {0.0, 1.0}
|
||||
// so we can visualize and threshold it
|
||||
Core.normalize(dist, dist, 0.0, 1.0, Core.NORM_MINMAX);
|
||||
Mat distDisplayScaled = new Mat();
|
||||
Core.multiply(dist, new Scalar(255), distDisplayScaled);
|
||||
Mat distDisplay = new Mat();
|
||||
distDisplayScaled.convertTo(distDisplay, CvType.CV_8U);
|
||||
HighGui.imshow("Distance Transform Image", distDisplay);
|
||||
//! [dist]
|
||||
|
||||
//! [peaks]
|
||||
// Threshold to obtain the peaks
|
||||
// This will be the markers for the foreground objects
|
||||
Imgproc.threshold(dist, dist, 0.4, 1.0, Imgproc.THRESH_BINARY);
|
||||
|
||||
// Dilate a bit the dist image
|
||||
Mat kernel1 = Mat.ones(3, 3, CvType.CV_8U);
|
||||
Imgproc.dilate(dist, dist, kernel1);
|
||||
Mat distDisplay2 = new Mat();
|
||||
dist.convertTo(distDisplay2, CvType.CV_8U);
|
||||
Core.multiply(distDisplay2, new Scalar(255), distDisplay2);
|
||||
HighGui.imshow("Peaks", distDisplay2);
|
||||
//! [peaks]
|
||||
|
||||
//! [seeds]
|
||||
// Create the CV_8U version of the distance image
|
||||
// It is needed for findContours()
|
||||
Mat dist_8u = new Mat();
|
||||
dist.convertTo(dist_8u, CvType.CV_8U);
|
||||
|
||||
// Find total markers
|
||||
List<MatOfPoint> contours = new ArrayList<>();
|
||||
Mat hierarchy = new Mat();
|
||||
Imgproc.findContours(dist_8u, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
|
||||
|
||||
// Create the marker image for the watershed algorithm
|
||||
Mat markers = Mat.zeros(dist.size(), CvType.CV_32S);
|
||||
|
||||
// Draw the foreground markers
|
||||
for (int i = 0; i < contours.size(); i++) {
|
||||
Imgproc.drawContours(markers, contours, i, new Scalar(i + 1), -1);
|
||||
}
|
||||
|
||||
// Draw the background marker
|
||||
Mat markersScaled = new Mat();
|
||||
markers.convertTo(markersScaled, CvType.CV_32F);
|
||||
Core.normalize(markersScaled, markersScaled, 0.0, 255.0, Core.NORM_MINMAX);
|
||||
Imgproc.circle(markersScaled, new Point(5, 5), 3, new Scalar(255, 255, 255), -1);
|
||||
Mat markersDisplay = new Mat();
|
||||
markersScaled.convertTo(markersDisplay, CvType.CV_8U);
|
||||
HighGui.imshow("Markers", markersDisplay);
|
||||
Imgproc.circle(markers, new Point(5, 5), 3, new Scalar(255, 255, 255), -1);
|
||||
//! [seeds]
|
||||
|
||||
//! [watershed]
|
||||
// Perform the watershed algorithm
|
||||
Imgproc.watershed(imgResult, markers);
|
||||
|
||||
Mat mark = Mat.zeros(markers.size(), CvType.CV_8U);
|
||||
markers.convertTo(mark, CvType.CV_8UC1);
|
||||
Core.bitwise_not(mark, mark);
|
||||
// imshow("Markers_v2", mark); // uncomment this if you want to see how the mark
|
||||
// image looks like at that point
|
||||
|
||||
// Generate random colors
|
||||
Random rng = new Random(12345);
|
||||
List<Scalar> colors = new ArrayList<>(contours.size());
|
||||
for (int i = 0; i < contours.size(); i++) {
|
||||
int b = rng.nextInt(256);
|
||||
int g = rng.nextInt(256);
|
||||
int r = rng.nextInt(256);
|
||||
|
||||
colors.add(new Scalar(b, g, r));
|
||||
}
|
||||
|
||||
// Create the result image
|
||||
Mat dst = Mat.zeros(markers.size(), CvType.CV_8UC3);
|
||||
byte[] dstData = new byte[(int) (dst.total() * dst.channels())];
|
||||
dst.get(0, 0, dstData);
|
||||
|
||||
// Fill labeled objects with random colors
|
||||
int[] markersData = new int[(int) (markers.total() * markers.channels())];
|
||||
markers.get(0, 0, markersData);
|
||||
for (int i = 0; i < markers.rows(); i++) {
|
||||
for (int j = 0; j < markers.cols(); j++) {
|
||||
int index = markersData[i * markers.cols() + j];
|
||||
if (index > 0 && index <= contours.size()) {
|
||||
dstData[(i * dst.cols() + j) * 3 + 0] = (byte) colors.get(index - 1).val[0];
|
||||
dstData[(i * dst.cols() + j) * 3 + 1] = (byte) colors.get(index - 1).val[1];
|
||||
dstData[(i * dst.cols() + j) * 3 + 2] = (byte) colors.get(index - 1).val[2];
|
||||
} else {
|
||||
dstData[(i * dst.cols() + j) * 3 + 0] = 0;
|
||||
dstData[(i * dst.cols() + j) * 3 + 1] = 0;
|
||||
dstData[(i * dst.cols() + j) * 3 + 2] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
dst.put(0, 0, dstData);
|
||||
|
||||
// Visualize the final image
|
||||
HighGui.imshow("Final Result", dst);
|
||||
//! [watershed]
|
||||
|
||||
HighGui.waitKey();
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class ImageSegmentationDemo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
new ImageSegmentation().run(args);
|
||||
}
|
||||
}
|
98
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/remap/RemapDemo.java
vendored
Normal file
98
3rdparty/opencv-4.5.4/samples/java/tutorial_code/ImgTrans/remap/RemapDemo.java
vendored
Normal file
@ -0,0 +1,98 @@
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.CvType;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class Remap {
|
||||
private Mat mapX = new Mat();
|
||||
private Mat mapY = new Mat();
|
||||
private Mat dst = new Mat();
|
||||
private int ind = 0;
|
||||
|
||||
//! [Update]
|
||||
private void updateMap() {
|
||||
float buffX[] = new float[(int) (mapX.total() * mapX.channels())];
|
||||
mapX.get(0, 0, buffX);
|
||||
|
||||
float buffY[] = new float[(int) (mapY.total() * mapY.channels())];
|
||||
mapY.get(0, 0, buffY);
|
||||
|
||||
for (int i = 0; i < mapX.rows(); i++) {
|
||||
for (int j = 0; j < mapX.cols(); j++) {
|
||||
switch (ind) {
|
||||
case 0:
|
||||
if( j > mapX.cols()*0.25 && j < mapX.cols()*0.75 && i > mapX.rows()*0.25 && i < mapX.rows()*0.75 ) {
|
||||
buffX[i*mapX.cols() + j] = 2*( j - mapX.cols()*0.25f ) + 0.5f;
|
||||
buffY[i*mapY.cols() + j] = 2*( i - mapX.rows()*0.25f ) + 0.5f;
|
||||
} else {
|
||||
buffX[i*mapX.cols() + j] = 0;
|
||||
buffY[i*mapY.cols() + j] = 0;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
buffX[i*mapX.cols() + j] = j;
|
||||
buffY[i*mapY.cols() + j] = mapY.rows() - i;
|
||||
break;
|
||||
case 2:
|
||||
buffX[i*mapX.cols() + j] = mapY.cols() - j;
|
||||
buffY[i*mapY.cols() + j] = i;
|
||||
break;
|
||||
case 3:
|
||||
buffX[i*mapX.cols() + j] = mapY.cols() - j;
|
||||
buffY[i*mapY.cols() + j] = mapY.rows() - i;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
mapX.put(0, 0, buffX);
|
||||
mapY.put(0, 0, buffY);
|
||||
ind = (ind+1) % 4;
|
||||
}
|
||||
//! [Update]
|
||||
|
||||
public void run(String[] args) {
|
||||
String filename = args.length > 0 ? args[0] : "../data/chicky_512.png";
|
||||
//! [Load]
|
||||
Mat src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_COLOR);
|
||||
if (src.empty()) {
|
||||
System.err.println("Cannot read image: " + filename);
|
||||
System.exit(0);
|
||||
}
|
||||
//! [Load]
|
||||
|
||||
//! [Create]
|
||||
mapX = new Mat(src.size(), CvType.CV_32F);
|
||||
mapY = new Mat(src.size(), CvType.CV_32F);
|
||||
//! [Create]
|
||||
|
||||
//! [Window]
|
||||
final String winname = "Remap demo";
|
||||
HighGui.namedWindow(winname, HighGui.WINDOW_AUTOSIZE);
|
||||
//! [Window]
|
||||
|
||||
//! [Loop]
|
||||
for (;;) {
|
||||
updateMap();
|
||||
Imgproc.remap(src, dst, mapX, mapY, Imgproc.INTER_LINEAR);
|
||||
HighGui.imshow(winname, dst);
|
||||
if (HighGui.waitKey(1000) == 27) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
//! [Loop]
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class RemapDemo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
new Remap().run(args);
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
import org.opencv.core.Core;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfPoint2f;
|
||||
import org.opencv.core.Point;
|
||||
import org.opencv.highgui.HighGui;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
class GeometricTransforms {
|
||||
public void run(String[] args) {
|
||||
//! [Load the 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 the image]
|
||||
|
||||
//! [Set your 3 points to calculate the Affine Transform]
|
||||
Point[] srcTri = new Point[3];
|
||||
srcTri[0] = new Point( 0, 0 );
|
||||
srcTri[1] = new Point( src.cols() - 1, 0 );
|
||||
srcTri[2] = new Point( 0, src.rows() - 1 );
|
||||
|
||||
Point[] dstTri = new Point[3];
|
||||
dstTri[0] = new Point( 0, src.rows()*0.33 );
|
||||
dstTri[1] = new Point( src.cols()*0.85, src.rows()*0.25 );
|
||||
dstTri[2] = new Point( src.cols()*0.15, src.rows()*0.7 );
|
||||
//! [Set your 3 points to calculate the Affine Transform]
|
||||
|
||||
//! [Get the Affine Transform]
|
||||
Mat warpMat = Imgproc.getAffineTransform( new MatOfPoint2f(srcTri), new MatOfPoint2f(dstTri) );
|
||||
//! [Get the Affine Transform]
|
||||
|
||||
//! [Apply the Affine Transform just found to the src image]
|
||||
Mat warpDst = Mat.zeros( src.rows(), src.cols(), src.type() );
|
||||
|
||||
Imgproc.warpAffine( src, warpDst, warpMat, warpDst.size() );
|
||||
//! [Apply the Affine Transform just found to the src image]
|
||||
|
||||
/** Rotating the image after Warp */
|
||||
|
||||
//! [Compute a rotation matrix with respect to the center of the image]
|
||||
Point center = new Point(warpDst.cols() / 2, warpDst.rows() / 2);
|
||||
double angle = -50.0;
|
||||
double scale = 0.6;
|
||||
//! [Compute a rotation matrix with respect to the center of the image]
|
||||
|
||||
//! [Get the rotation matrix with the specifications above]
|
||||
Mat rotMat = Imgproc.getRotationMatrix2D( center, angle, scale );
|
||||
//! [Get the rotation matrix with the specifications above]
|
||||
|
||||
//! [Rotate the warped image]
|
||||
Mat warpRotateDst = new Mat();
|
||||
Imgproc.warpAffine( warpDst, warpRotateDst, rotMat, warpDst.size() );
|
||||
//! [Rotate the warped image]
|
||||
|
||||
//! [Show what you got]
|
||||
HighGui.imshow( "Source image", src );
|
||||
HighGui.imshow( "Warp", warpDst );
|
||||
HighGui.imshow( "Warp + Rotate", warpRotateDst );
|
||||
//! [Show what you got]
|
||||
|
||||
//! [Wait until user exits the program]
|
||||
HighGui.waitKey(0);
|
||||
//! [Wait until user exits the program]
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class GeometricTransformsDemo {
|
||||
public static void main(String[] args) {
|
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
|
||||
new GeometricTransforms().run(args);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user