0
OpenCV를 처음 사용하고 새로운 것을 시도합니다. 웹캠을 사용하여 손을 감지하고 싶습니다. 여기 간단한 코드가 있습니다. 그러나 그것은 내게 뭔가를 준다 : HaarCascade.exe 0x000000013f5b140b에서 처리되지 않은 예외 : 0xC0000005 : 0x0000000000000004 위치를 읽는 액세스 위반.OpenCV 라이브러리를 사용하여 C++에서 처리되지 않은 예외가 발생했습니다.
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
IplImage* img = 0;
CvHaarClassifierCascade *cascade;
CvMemStorage *cstorage;
CvMemStorage *hstorage;
void detectObjects(IplImage *img);
int key;
int main(int argc, char** argv)
{
CvCapture *capture;
IplImage *frame;
// loads classifier for hand haar cascade
char *filename = "haarcascade_hand.xml";
cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_hand.xml", 0, 0, 0);
// setup memory buffer
hstorage = cvCreateMemStorage(0);
cstorage = cvCreateMemStorage(0);
// initialize camera
capture = cvCaptureFromCAM(0);
// always check
//assert(cascade && storage && capture);
// create a window
cvNamedWindow("Camera", 1);
while(key!='q') {
// captures frame and check every frame
frame = cvQueryFrame(capture);
if(!frame) break;
// detect objects and display video
detectObjects (frame);
// quit if user press 'q'
key = cvWaitKey(10);
}
// free memory
cvReleaseCapture(&capture);
cvDestroyAllWindows();
cvReleaseHaarClassifierCascade(&cascade);
cvReleaseMemStorage(&cstorage);
cvReleaseMemStorage(&hstorage);
return 0;
}
void detectObjects(IplImage *img)
{
int px;
int py;
int edge_thresh = 1;
IplImage *gray = cvCreateImage(cvSize(640,480), 8, 1);
IplImage *edge = cvCreateImage(cvSize(640,480), 8, 1);
// convert video image color
cvCvtColor(img,gray,CV_BGR2GRAY);
// set the converted image's origin
gray->origin=1;
// color threshold
cvThreshold(gray,gray,100,255,CV_THRESH_BINARY);
// smooths out image
cvSmooth(gray, gray, CV_GAUSSIAN, 11, 11);
// get edges
cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 5);
// detects circle
CvSeq* circle = cvHoughCircles(gray, cstorage, CV_HOUGH_GRADIENT, 1, gray->height/50, 5, 35);
// draws circle and its centerpoint
float* p = (float*)cvGetSeqElem(circle, 0);
cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(255,0,0), -1, 8, 0);
cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(200,0,0), 1, 8, 0);
px=cvRound(p[0]);
py=cvRound(p[1]);
// displays coordinates of circle's center
cout <<"(x,y) -> ("<<px<<","<<py<<")"<<endl;
// detects hand
CvSeq *hand = cvHaarDetectObjects(img, cascade, hstorage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(100, 100));
// draws red box around hand when detected
CvRect *r = (CvRect*)cvGetSeqElem(hand, 0);
cvRectangle(img,
cvPoint(r->x, r->y),
cvPoint(r->x + r->width, r->y + r->height),
CV_RGB(255, 0, 0), 1, 8, 0);
cvShowImage("Camera",img);
}
이미지 : http://i.imgur.com/Dneiw.png
모든 답변에 감사드립니다.
당신이 있으 문제를 좁히기 위해 어떤 노력을 했습니까? 디버깅에서 무엇을 말 했나요? –
실패했기 때문에 '단언'한다고 주석 처리 했습니까? –
cvGetSeqElem은 0을 반환 할 수 있습니다. – fazo