GSoC 2016 - Adding ALIASES for tutorial (#7041)
* GSoC 2016 - Adding toggle files to be used by tutorials. Add a toggle option for tutorials. * adds a button on the HTML tutorial pages to switch between blocks * the default option is for languages: one can write a block for C++ and another one for Python without re-writing the tutorial Add aliases to the doxyfile. * adding alises to make a link to previous and next tutorial. * adding alias to specify the toggle options in the tutorials index. * adding alias to add a youtube video directly from link. Add a sample tutorial (mat_mask_opertaions) using the developed aliases: * youtube alias * previous and next tutorial alias * buttons * languages info for tutorial table of content * code referances with snippets (and associated sample code files) * Removing the automatic ordering. Adding specific toggles for cpp, java and python. Move all the code to the footer / header and Doxyfile. Updating documentation.
This commit is contained in:
committed by
Maksim Shabunin
parent
36b5abf6b7
commit
fcddfa4f86
@@ -50,11 +50,17 @@ int main( int argc, char* argv[])
|
||||
imshow( "Output", dst0 );
|
||||
waitKey();
|
||||
|
||||
//![kern]
|
||||
Mat kernel = (Mat_<char>(3,3) << 0, -1, 0,
|
||||
-1, 5, -1,
|
||||
0, -1, 0);
|
||||
//![kern]
|
||||
|
||||
t = (double)getTickCount();
|
||||
|
||||
//![filter2D]
|
||||
filter2D( src, dst1, src.depth(), kernel );
|
||||
//![filter2D]
|
||||
t = ((double)getTickCount() - t)/getTickFrequency();
|
||||
cout << "Built-in filter2D time passed in seconds: " << t << endl;
|
||||
|
||||
@@ -63,13 +69,19 @@ int main( int argc, char* argv[])
|
||||
waitKey();
|
||||
return 0;
|
||||
}
|
||||
//! [basic_method]
|
||||
void Sharpen(const Mat& myImage,Mat& Result)
|
||||
{
|
||||
//! [8_bit]
|
||||
CV_Assert(myImage.depth() == CV_8U); // accept only uchar images
|
||||
//! [8_bit]
|
||||
|
||||
//! [create_channels]
|
||||
const int nChannels = myImage.channels();
|
||||
Result.create(myImage.size(),myImage.type());
|
||||
//! [create_channels]
|
||||
|
||||
//! [basic_method_loop]
|
||||
for(int j = 1 ; j < myImage.rows-1; ++j)
|
||||
{
|
||||
const uchar* previous = myImage.ptr<uchar>(j - 1);
|
||||
@@ -84,9 +96,13 @@ void Sharpen(const Mat& myImage,Mat& Result)
|
||||
-current[i-nChannels] - current[i+nChannels] - previous[i] - next[i]);
|
||||
}
|
||||
}
|
||||
//! [basic_method_loop]
|
||||
|
||||
//! [borders]
|
||||
Result.row(0).setTo(Scalar(0));
|
||||
Result.row(Result.rows-1).setTo(Scalar(0));
|
||||
Result.col(0).setTo(Scalar(0));
|
||||
Result.col(Result.cols-1).setTo(Scalar(0));
|
||||
//! [borders]
|
||||
}
|
||||
//! [basic_method]
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
#include <iostream>
|
||||
|
||||
/**
|
||||
* @function main
|
||||
* @brief Main function
|
||||
*/
|
||||
int main( void )
|
||||
{
|
||||
//! [hello_world]
|
||||
std::cout << "Hello World!";
|
||||
//! [hello_world]
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
import org.opencv.core.*;
|
||||
import org.opencv.imgcodecs.Imgcodecs;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.Image;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.DataBufferByte;
|
||||
|
||||
class MatMaskOperationsRun {
|
||||
|
||||
public void run() {
|
||||
|
||||
//! [laod_image]
|
||||
Mat I = Imgcodecs.imread("../data/lena.jpg");
|
||||
if(I.empty())
|
||||
System.out.println("Error opening image");
|
||||
//! [laod_image]
|
||||
|
||||
Image img = toBufferedImage( I );
|
||||
displayImage("Input Image" , img, 0, 200 );
|
||||
|
||||
double t = System.currentTimeMillis();
|
||||
|
||||
Mat J = sharpen(I, new Mat());
|
||||
|
||||
t = ((double)System.currentTimeMillis() - t)/1000;
|
||||
System.out.println("Hand written function times passed in seconds: " + t);
|
||||
|
||||
Image img2 = toBufferedImage( J );
|
||||
displayImage("Output Image" , img2, 400, 400 );
|
||||
|
||||
Mat K = new Mat();
|
||||
//![kern]
|
||||
Mat kern = new Mat( 3, 3, CvType.CV_8S );
|
||||
int row = 0, col = 0;
|
||||
kern.put(row ,col, 0, -1, 0, -1, 5, -1, 0, -1, 0 );
|
||||
//![kern]
|
||||
|
||||
System.out.println("kern = \n" + kern.dump());
|
||||
|
||||
t = System.currentTimeMillis();
|
||||
|
||||
//![filter2D]
|
||||
Imgproc.filter2D(I, K, I.depth(), kern );
|
||||
//![filter2D]
|
||||
|
||||
t = ((double)System.currentTimeMillis() - t)/1000;
|
||||
System.out.println("Built-in filter2D time passed in seconds: " + t);
|
||||
|
||||
Image img3 = toBufferedImage( J );
|
||||
displayImage("filter2D Output Image" , img3, 800, 400 );
|
||||
}
|
||||
|
||||
//! [basic_method]
|
||||
public static double saturateCastUchar(double x) {
|
||||
return x > 255.0 ? 255.0 : (x < 0.0 ? 0.0 : x);
|
||||
}
|
||||
|
||||
public Mat sharpen(Mat myImage, Mat Result)
|
||||
{
|
||||
//! [8_bit]
|
||||
myImage.convertTo(myImage, CvType.CV_8U);
|
||||
//! [8_bit]
|
||||
|
||||
//! [create_channels]
|
||||
int nChannels = myImage.channels();
|
||||
Result.create(myImage.size(),myImage.type());
|
||||
//! [create_channels]
|
||||
|
||||
//! [basic_method_loop]
|
||||
for(int j = 1 ; j < myImage.rows()-1; ++j)
|
||||
{
|
||||
for(int i = 1 ; i < myImage.cols()-1; ++i)
|
||||
{
|
||||
double sum[] = new double[nChannels];
|
||||
|
||||
for(int k = 0; k < nChannels; ++k) {
|
||||
|
||||
double top = -myImage.get(j - 1, i)[k];
|
||||
double bottom = -myImage.get(j + 1, i)[k];
|
||||
double center = (5 * myImage.get(j, i)[k]);
|
||||
double left = -myImage.get(j , i - 1)[k];
|
||||
double right = -myImage.get(j , i + 1)[k];
|
||||
|
||||
sum[k] = saturateCastUchar(top + bottom + center + left + right);
|
||||
}
|
||||
|
||||
Result.put(j, i, sum);
|
||||
}
|
||||
}
|
||||
//! [basic_method_loop]
|
||||
|
||||
//! [borders]
|
||||
Result.row(0).setTo(new Scalar(0));
|
||||
Result.row(Result.rows()-1).setTo(new Scalar(0));
|
||||
Result.col(0).setTo(new Scalar(0));
|
||||
Result.col(Result.cols()-1).setTo(new Scalar(0));
|
||||
//! [borders]
|
||||
|
||||
return Result;
|
||||
}
|
||||
//! [basic_method]
|
||||
|
||||
public Image toBufferedImage(Mat m) {
|
||||
int type = BufferedImage.TYPE_BYTE_GRAY;
|
||||
if ( m.channels() > 1 ) {
|
||||
type = BufferedImage.TYPE_3BYTE_BGR;
|
||||
}
|
||||
int bufferSize = m.channels()*m.cols()*m.rows();
|
||||
byte [] b = new byte[bufferSize];
|
||||
m.get(0,0,b); // get all the pixels
|
||||
BufferedImage image = new BufferedImage(m.cols(),m.rows(), type);
|
||||
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
|
||||
System.arraycopy(b, 0, targetPixels, 0, b.length);
|
||||
return image;
|
||||
}
|
||||
|
||||
public void displayImage(String title, Image img, int x, int y)
|
||||
{
|
||||
ImageIcon icon=new ImageIcon(img);
|
||||
JFrame frame=new JFrame(title);
|
||||
JLabel lbl=new JLabel(icon);
|
||||
frame.add(lbl);
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.pack();
|
||||
frame.setLocation(x, y);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
public class MatMaskOperations {
|
||||
public static void main(String[] args) {
|
||||
|
||||
// Load the native library.
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||
new MatMaskOperationsRun().run();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
public class Documentation {
|
||||
|
||||
public static void main (String[] args) {
|
||||
|
||||
//! [hello_world]
|
||||
System.out.println ("Hello World!");
|
||||
//! [hello_world]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
import time
|
||||
import numpy as np
|
||||
import cv2
|
||||
## [basic_method]
|
||||
def sharpen(my_image):
|
||||
my_image = cv2.cvtColor(my_image, cv2.CV_8U)
|
||||
|
||||
height, width, n_channels = my_image.shape
|
||||
result = np.zeros(my_image.shape, my_image.dtype)
|
||||
|
||||
## [basic_method_loop]
|
||||
for j in range (1, height-1):
|
||||
for i in range (1, width-1):
|
||||
for k in range (0, n_channels):
|
||||
sum = 5 * my_image[j, i, k] - my_image[j + 1, i, k] - my_image[j - 1, i, k]\
|
||||
- my_image[j, i + 1, k] - my_image[j, i - 1, k];
|
||||
|
||||
if sum > 255:
|
||||
sum = 255
|
||||
if sum < 0:
|
||||
sum = 0
|
||||
|
||||
result[j, i, k] = sum
|
||||
## [basic_method_loop]
|
||||
|
||||
return result
|
||||
## [basic_method]
|
||||
|
||||
|
||||
I = cv2.imread("../data/lena.jpg")
|
||||
cv2.imshow('Input Image', I)
|
||||
|
||||
t = round(time.time())
|
||||
J = sharpen(I)
|
||||
t = (time.time() - t)/1000
|
||||
print "Hand written function times passed in seconds: %s" % t
|
||||
|
||||
cv2.imshow('Output Image', J)
|
||||
|
||||
t = time.time()
|
||||
## [kern]
|
||||
kernel = np.array([ [0,-1,0],
|
||||
[-1,5,-1],
|
||||
[0,-1,0] ],np.float32) # kernel should be floating point type
|
||||
## [kern]
|
||||
|
||||
## [filter2D]
|
||||
K = cv2.filter2D(I, -1, kernel) # ddepth = -1, means destination image has depth same as input image.
|
||||
## [filter2D]
|
||||
|
||||
t = (time.time() - t)/1000
|
||||
print "Built-in filter2D time passed in seconds: %s" % t
|
||||
|
||||
cv2.imshow('filter2D Output Image', K)
|
||||
|
||||
cv2.waitKey(0)
|
||||
cv2.destroyAllWindows()
|
||||
@@ -0,0 +1,5 @@
|
||||
print('Not showing this text because it is outside the snippet')
|
||||
|
||||
## [hello_world]
|
||||
print('Hello world!')
|
||||
## [hello_world]
|
||||
Reference in New Issue
Block a user