JAVA와 OpenCV를 이용하여 소벨 에지(Sobel Edge)와 캐니 에지(Canny Edge)를 검출해보겠습니다.
Sobel Edge & Canny Edge
public static void showCannyNSobelEdgeWithLenna() {
try {
String locLenna = "경로생략/LennaGray.png";
Mat imageLenna = Imgcodecs.imread(locLenna);
// GrayScale
Imgproc.cvtColor(imageLenna, imageLenna, Imgproc.COLOR_RGB2GRAY);
// Start Canny Edge
Mat cannyLenna = new Mat();
Imgproc.Canny(imageLenna, cannyLenna, 30, 30*2.5, 3);
// End Canny Edge
// Start Sobel Edge
Mat sobelLenna = new Mat();
Mat sobelLenna_x = new Mat(), sobelLenna_y = new Mat();
Mat sobelLenna_x_abs = new Mat(), sobelLenna_y_abs = new Mat();
// Sobel Edge - horizontal direction
Imgproc.Sobel(imageLenna, sobelLenna_x, CvType.CV_16S, 1, 0, 3, 1, 0);
// Sobel Edge - vertical direction
Imgproc.Sobel(imageLenna, sobelLenna_y, CvType.CV_16S, 0, 1, 3, 1, 0);
//Calculating absolute value of gradients in both the direction
Core.convertScaleAbs(sobelLenna_x, sobelLenna_x_abs);
Core.convertScaleAbs(sobelLenna_y, sobelLenna_y_abs);
//Calculating the resultant gradient
Core.addWeighted(sobelLenna_x_abs, 0.5, sobelLenna_y, 0.5, 1, sobelLenna, 8);
// End Sobel Edge
// Show
HighGui.imshow("Lenna", imageLenna);
HighGui.imshow("Lenna(Canny Edge)", cannyLenna);
HighGui.imshow("Lenna(Sobel Edge)", sobelLenna);
HighGui.waitKey();
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
01
Canny Edge - 보너스 GUI
마우스로 지정한 공간의 Canny Edge를 구하는 프로그램입니다.
public static void showCannyWithMouseEvent() {
try {
String locLenna = "경로생략/LennaGray.png";
Mat imageLenna = Imgcodecs.imread(locLenna);
// Start Canny Edge
Mat cannyLenna = new Mat();
Imgproc.Canny(imageLenna, cannyLenna, 30, 30*2.5, 3);
// End Canny Edge
// Show
JFrame window = HighGui.createJFrame("Lenna(feat.MouseEvent)", 1);
window.setBounds(100, 100, 518, 541);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setLayout(null);
window.setVisible(true);
// 선택된 영역
JLabel selectedImgLabel = new JLabel();
selectedImgLabel.setBounds(0, 0, 512, 512);
window.getContentPane().add(selectedImgLabel);
// 이미지
Image img = HighGui.toBufferedImage(imageLenna);
JLabel imgLabel = new JLabel(new ImageIcon(img));
imgLabel.setBounds(0, 0, 512, 512);
imgLabel.addMouseListener(new MouseListener() {
int startX = 0, startY = 0;
@Override
public void mousePressed(MouseEvent e) {
startX = e.getX();
startY = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
Rect box = new Rect();
box.x = startX; box.y = startY;
box.width = e.getX() - startX; box.height = e.getY() - startY;
Imgproc.Canny(new Mat(imageLenna ,box), cannyLenna, 30, 30*2.5, 3);
Image img = HighGui.toBufferedImage(cannyLenna);
selectedImgLabel.setIcon(new ImageIcon(img));
selectedImgLabel.setBounds(box.x, box.y, box.width, box.height);
window.repaint();
}
@Override public void mouseExited(MouseEvent e) {/*Nothing...*/}
@Override public void mouseEntered(MouseEvent e) {/*Nothing...*/}
@Override public void mouseClicked(MouseEvent e) {/*Nothing...*/}
});
window.getContentPane().add(imgLabel);
} catch (Exception e) {
e.printStackTrace();
}
}
0123
'프로그래밍 > OpenCV.' 카테고리의 다른 글
[OpenCV] 07.. OpenCV 빠른 매칭과 변환 행렬 추정(feat.JAVA) (0) | 2020.11.02 |
---|---|
[OpenCV] 06.. SIFT Key Point, 기술자 추출(feat.JAVA) (0) | 2020.11.02 |
[OpenCV] 04.. OpenCV 평활화와 이진화(feat.JAVA) (0) | 2020.10.17 |
[OpenCV] 03.. OpenCV 히스토그램(feat.JAVA) (0) | 2020.10.17 |
[OpenCV] 02.. Gray Scale과 Resize (2) | 2020.09.20 |
댓글