
Canny() 함수 구성요소
void Canny(Input Image, Output Image, double threshold1, double threshold2, iny apertureSize = 3, bool L2gradient = FALSE);
threshold1: 하단 임계값
threshold2: 상단 임계값
apertureSize: 사용되는 Sobel 미분 마스크의 커널 크기, 디폴트는 3
L2gradient
- TRUE: L2 norm
- FALSE: L1 norm
→ L2가 L1보다 더 정확하지만 속도가 느려서 L1을 기본값으로 사용함
→ threshold2를 너무 높게 설정하면 엣지가 잘 검출되지 않고, threshold1을 너무 낮게 설정하면 원치 않은 엣지까지 검출할 수 있음. 그래서 적절한 값을 잘 찾아야 함
void CTreeCtrlDlg::OnClickedCheckEdge()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
if (m_chEdge.GetCheck() == BST_CHECKED) {
if (!m_matImage.empty())
{
// m_matOriginalImage = m_matImage.clone();
Mat imgEdge;
Canny(m_matImage, imgEdge, 100, 150);
resize(imgEdge, imgEdge, Size(200, 200));
m_matImage = imgEdge;
CreateBitmapInfo(m_matImage.cols, m_matImage.rows, m_matImage.channels() * 8);
DrawImage();
}
else {
AfxMessageBox(_T("이미지를 선택하세요"));
m_chEdge.SetCheck(BST_UNCHECKED);
}
}
// 흑백 체크 해제 시 원본 이미지로 복원
else {
if (!m_matOriginalImage.empty()) {
m_matImage = m_matOriginalImage.clone(); // 원본 이미지를 복원
resize(m_matImage, m_matImage, Size(200, 200));
//imshow("img_edge", m_matImage);
CreateBitmapInfo(m_matImage.cols, m_matImage.rows, m_matImage.channels() * 8);
DrawImage();
}
else {
AfxMessageBox(_T("복원할 수 없음"), MB_ICONSTOP);
m_chEdge.SetCheck(BST_UNCHECKED);
}
}
}