저는 졸업작품 만들고 있는 대학생입니다.
소프트웨어 순서를 말씀 드리면
1. 사진을 찍는다
2. 케니에지 필터를 통해 사진의 윤곽선을 검출합니다.
3. 윤곽선을 검출한 파일을 트래킹 함수로 넘깁니다.
4. 트래킹 함수 에서 각 점의 위치를 파악해 이동 경로를 만듭니다.
5. 이동경로에 대한 정보를 ATmega128로 전송합니다.
간단하게 전체 기기의 순서를 말씀드리면 이렇습니다. 근데 다른건 다 구현해 냈는데 3번이 잘 되고 있지를 않습니다.
정확하게는 디버그 오류가 발생하게 되는데 디버깅 하면서 오류의 원인을 찾아보니 스택 오버플로우가 일어 났다고 합니다.
/*****************헤더 파일 상의 클래스와 인스턴스 선언****************************/
class Canny //케니 연산자 클래스
{
private:
int high_threshold; //높은 경계값
int low_threshold; //낮은 경계값
public:
Canny(int high, int low);
cv::Mat GetEdge(const cv::Mat &image); //엣지 검출
};
class ImageHandler
{
public:
void ImagePrint(char window[30], const cv::Mat &image);
void ImagePrint(char window[30], const cv::Mat &image, int height, int width);
void ShowImageInfo(const cv::Mat& image, char name[30]);
cv::Mat FaceCognition(const cv::Mat&);
};
/************************인스턴스 선언****************************/
Canny::Canny(int high, int low) :high_threshold(high), low_threshold(low)
{ }
cv::Mat Canny::GetEdge(const cv::Mat &image)
{
cv::Mat contours, contoursInv;
cv::Canny(image, contours, low_threshold, high_threshold); //캐니 연산자 적용
cv::threshold(contours, contoursInv, 128, 255, cv::THRESH_BINARY_INV); //반전
cout << "Canny Operator" << endl;
return contoursInv;
}
/************************메인 함수************************************/
int main(){
ImageHandler handler;
Webcam cam(0);
cam.Connected(); //웹캠 연결
cv::Mat capture = cam.Photograph(); //캡쳐
handler.ShowImageInfo(capture, "Capture Image");//캡쳐한 이미지 정보 출력
if ((cam.GetState() == 'c') || (cam.GetState() == 'C')) {
Canny canny(50, 150);//캐니 연산자 클래스
cv::Mat sobelimage, cannyimage, morphoimage, gray, gray2, gray3;
cv::cvtColor(capture, gray, CV_RGB2GRAY); //흑백이미지로 변환
cv::equalizeHist(gray, gray2);//히스토그램 평활화
handler.ImagePrint("Gray Image", gray); //흑백이미지 출력
handler.ImagePrint("Gray Image2", gray2);//평활화한 이미지 출력
//엣지 검출
cannyimage = canny.GetEdge(gray2);
//엣지 검출한 이미지 출력
handler.ImagePrint("Canny Image", cannyimage);
//출력한 이미지를 트래킹 함수로 보내는 작업
cv::Mat image;
cv::Mat image = cannyimage;
tracking(&image);
//트래킹이 모두 끝나고 작업물을 띄우는 과정
cv::waitKey(0);
cv::destroyAllWindows();
}
헤더 파일 상에서 클래스와 인스터스 이름이 겹쳐서 그런 일이 일어났나 해서 둘다 이름을 아예 바꿔 봤는데 그렇게 하니까
명시적 형식이 존재 하지 않습니다. (int)형으로 간주 합니다. 라고 뜨네요
딱 요고만 하면 완성인데 ㅠㅠ 너무 막막합니다. 어디가 잘못된 걸까요?