프로세싱에서 제가 위에서 말한 GSVideo를 실행했을때 hypermedia가 없다고 뜨는건가요? "No library found for hypermedia.video" 이 에러가 맞는지 확인 부탁드릴게요.
코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-08-25 13:20:41
NO | 부품명 | 수량 | 상세정보 |
1 | 아두이노 보드 | 1 | UNO, Mega2560, MegaADK |
2 | 브레드 보드 | 1 | |
3 | 서보 모터 | 2 | |
4 | 웹캠 | 1 | |
5 | 케이블 | 6~10 |
부품명 | 아두이노 보드 | 브레드 보드 | 서보 모터 2개 | 웹캠 | 케이블 |
부품 사진 |
import processing.serial.*;
// Combining GSVideo capture with the OpenCV library for face detection
// http://ubaa.net/shared/processing/opencv/
import hypermedia.video.*;
import java.awt.Rectangle;
import codeanticode.gsvideo.*;
OpenCV opencv;
GSCapture cam;
// 대비, 밝기 조절 변수
int contrast_value = 0;
int brightness_value = 0;
//수직, 수평으로 움직이는 서보모터를 구별하기 위한 변수
char verticalSignal = 0;
char horizonSignal = 1;
//서보모터 각도의 초기값 지정
char servoHPosition = 90;
char servoVPosition = 90;
//얼굴 중앙값 초기화
int midFaceY=0;
int midFaceX=0;
//화면의 중심좌표값 지정
int midScreenY = (480/2);
int midScreenX = (640/2);
int midScreenWindow = 10; //화면 중앙에서 어느정도 위치안에 얼굴의 중앙위치점가 들어올 경우
//스크린에서 중앙으로 들어왔다고 인식할 것인지 오차범위 지정
int stepSize=1; //모터 이동값 지정
Serial port;
void setup() {
size(640, 480);
cam = new GSCapture(this, 640, 480);
cam.start();
//OpenCV사용 초기화
opencv = new OpenCV(this);
opencv.allocate(640,480);
// "haarcascade_frontalface_alt.xml"을 불러와서 얼굴의 앞을 인식한다
opencv.cascade( OpenCV.CASCADE_FRONTALFACE_ALT );
println(Serial.list());
println(midScreenX);
println(midScreenY);
//시리얼통신을 위한 포트 생성
port = new Serial(this, Serial.list()[0], 57600);
//메시지 프린트
println("Drag mouse on X-axis inside this sketch window to change contrast");
println("Drag mouse on Y-axis inside this sketch window to change brightness");
//서보모터 초기각도 전송
port.write(horizonSignal);
port.write(servoHPosition);
port.write(verticalSignal);
port.write(servoVPosition);
}
void captureEvent(GSCapture c) {
c.read();
}
public void stop() {
opencv.stop();
super.stop();
}
void draw() {
opencv.copy(cam);
opencv.convert(GRAY);
opencv.contrast(contrast_value);
opencv.brightness(brightness_value);
//OpenCV라이브러리를 이용하여 사람의 얼굴 앞면을 인식한다.
Rectangle[] faces = opencv.detect(1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40);
//캠에서 인식하는 이미지를 화면에 출력하여 영상으로 만든다
image(cam, 0, 0);
//인식한 얼굴의 테두리에 사각형을 그린다.
noFill();
stroke(0, 255, 0);
strokeWeight(5);
for(int i = 0; i < faces.length; i++) {
rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
}
//얼굴의 길이가 0보다 클 경우(사람의 얼굴을 인식하고 있을 경우)
if(faces.length > 0){
//현재 인식하고 있는 얼굴의 중앙 점을 구하여 midFaceX와 midFaceY에 저장
midFaceX = faces[0].x + (faces[0].width/2);
midFaceY = faces[0].y + (faces[0].height/2);
//현재 얼굴의 위치가 스크린의 중앙보다 아래에 위치할 경우 수직으로 움직이는 서보모터의 각도를 1도씩 감소시킨다
if(midFaceY < (midScreenY - midScreenWindow)){
if(servoVPosition >= 5)
servoVPosition -= stepSize;
}
//현재 얼굴의 위치가 스크린의 중앙보다 위에 위치할 경우 수직으로 움직이는 서보모터의 각도를 1도씩 증가시킨다
else if(midFaceY > (midScreenY + midScreenWindow)){
if(servoVPosition <= 175)
servoVPosition +=stepSize;
}
//현재 얼굴의 위치가 스크린의 중앙보다 왼쪽에 위치할 경우 수평으로 움직이는 서보모터의 각도를 1도씩 감소시킨다
if(midFaceX < (midScreenX - midScreenWindow)){
if(servoHPosition >= 5)
servoHPosition -= stepSize;
}
//현재 얼굴의 위치가 스크린의 중앙보다 아래에 위치할 경우 수평으로 움직이는 서보모터의 각도를 1도씩 증가시킨다
else if(midFaceX > midScreenX + midScreenWindow){
if(servoHPosition <= 175)
servoHPosition +=stepSize;
}
}
//각자 서보모터의 각도를 시리얼통신을 통해 전송
port.write(horizonSignal);
port.write(servoHPosition);
port.write(verticalSignal);
port.write(servoVPosition);
delay(1);
}
//밝기 대조값 변경
void mouseDragged() {
contrast_value = int(map(mouseX, 0, width, -128, 128));
brightness_value = int(map(mouseY, 0, width, -128, 128));
}
//수직, 수평으로 움직이는 서보모터를 구별하기 위한 변수 char verticalSignal = 0; char horizonSignal = 1;
//서보모터 각도의 초기값 지정 char servoHPosition = 90; char servoVPosition = 90; //얼굴 중앙값 초기화 int midFaceY=0; int midFaceX=0;
//화면의 중심좌표값 지정 int midScreenY = (480/2); int midScreenX = (640/2); int midScreenWindow = 10; //화면 중앙에서 어느정도 위치안에 얼굴의 중앙위치점가 들어올 경우
//스크린에서 중앙으로 들어왔다고 인식할 것인지 오차범위 지정
//OpenCV라이브러리를 이용하여 사람의 얼굴 앞면을 인식한다. Rectangle[] faces = opencv.detect(1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40); //캠에서 인식하는 이미지를 화면에 출력하여 영상으로 만든다 image(cam, 0, 0); //인식한 얼굴의 테두리에 사각형을 그린다. noFill(); //채우기 없음 stroke(0, 255, 0); //R:0, G:255, B:0 녹색의 사각형을 그린다. strokeWeight(5); //사각형의 테두리는 5로 지정한다 for(int i = 0; i < faces.length; i++) { rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); }
if(faces.length > 0){
//현재 인식하고 있는 얼굴의 중앙 점을 구하여 midFaceX와 midFaceY에 저장
midFaceX = faces[0].x + (faces[0].width/2); midFaceY = faces[0].y + (faces[0].height/2);
//현재 얼굴의 위치가 스크린의 중앙보다 아래에 위치할 경우 수직으로 움직이는 서보모터의 각도를 1도씩 감소시킨다 if(midFaceY < (midScreenY - midScreenWindow)){ if(servoVPosition >= 5) servoVPosition -= stepSize; }
//현재 얼굴의 위치가 스크린의 중앙보다 위에 위치할 경우 수직으로 움직이는 서보모터의 각도를 1도씩 증가시킨다 else if(midFaceY > (midScreenY + midScreenWindow)){ if(servoVPosition <= 175) servoVPosition +=stepSize; }
//현재 얼굴의 위치가 스크린의 중앙보다 왼쪽에 위치할 경우 수평으로 움직이는 서보모터의 각도를 1도씩 감소시킨다 if(midFaceX < (midScreenX - midScreenWindow)){ if(servoHPosition >= 5) servoHPosition -= stepSize; }
//현재 얼굴의 위치가 스크린의 중앙보다 아래에 위치할 경우 수평으로 움직이는 서보모터의 각도를 1도씩 증가시킨다 else if(midFaceX > midScreenX + midScreenWindow){ if(servoHPosition <= 175) servoHPosition +=stepSize; } }
#include <Servo.h> //서보모터 라이브러리 사용
//수직, 수평으로 움직이는 서보모터를 구별하기 위한 변수
char verticalSignal=0, horizonSignal=1; Servo servoV, servoH; //서보모터 객체 생성 char serialChar=0;
//서보모터의 핀번호를 설정하고, 시리얼통신을 초기화하며 모터의 초기각도를 지정한다. void setup(){ servoV.attach(9); servoH.attach(10); servoV.write(90); servoH.write(90); Serial.begin(57600); } void loop(){ while(Serial.available() <=0); //시리얼통신을 통해 데이터를 받을때까지 대기한다 serialChar = Serial.read(); //데이터를 받았을 경우 if(serialChar == verticalSignal){ //수직모터를 움직이라는 신호를 받았을 경우 while(Serial.available() <=0); //각도값을 받을 때까지 대기 servoV.write(Serial.read()); //각도값을 받았을 경우 모터를 전송받은 값만큼 움직인다 } else if(serialChar == horizonSignal){ //수평모터를 움직이라는 신호를 받았을 경우 while(Serial.available() <= 0); //각도값을 받을 때까지 대기 servoH.write(Serial.read()); //각도값을 받았을 경우 모터를 전송받은 값만큼 움직인다 } }
void loop(){ while(Serial.available() <=0); //시리얼통신을 통해 데이터를 받을때까지 대기한다 serialChar = Serial.read(); //데이터를 받았을 경우 if(serialChar == verticalSignal){ //수직모터를 움직이라는 신호를 받았을 경우 while(Serial.available() <=0); //각도값을 받을 때까지 대기 servoV.write(Serial.read()); //각도값을 받았을 경우 모터를 전송받은 값만큼 움직인다 } else if(serialChar == horizonSignal){ //수평모터를 움직이라는 신호를 받았을 경우 while(Serial.available() <= 0); //각도값을 받을 때까지 대기 servoH.write(Serial.read()); //각도값을 받았을 경우 모터를 전송받은 값만큼 움직인다 } }
수박쨈
프로세싱에서 제가 위에서 말한 GSVideo를 실행했을때 hypermedia가 없다고 뜨는건가요? "No library found for hypermedia.video" 이 에러가 맞는지 확인 부탁드릴게요.
네
위 글에 Processing용 OpenCV라이브러리를 추가하여 수정하였습니다. (GSvideo라이브러리 위쪽에 OpenCV라이브러리 내려받기 링크 걸어놨습니다.) Hypermedia는 OpenCV라이브러리 폴더안에 존재하는 폴더이며 현재 사용하고 계신 프로세싱내에 OpenCV라이브러리가 존재하지 않기 때문에 생긴 오류인듯 합니다. 제가 위에 올려놓은 OpenCV라이브러리 폴더안에서 src/java로 들어가시면 Hypermedia폴더와 하위 폴더내에 Video라는 폴더를 보실 수 있습니다.
이건 해결이 되었는데
이젠 또 다른 경고 문구가 뜨네요 ㅜ
A library used by this sketch is not installed properly
이렇게 떠요. ㅜㅜ 32비트에서 실행해야 한다고 하는데 제가 윈도우 64비트를 사용하고있어서 그런건지
rudals2204 2014-11-23 22:26:13
지금 파일실행은 성공했거든요.. 그래서 조금이나마 도움이 되었으면해서 댓글달아요..ㅎ window 64bit이시면 processing 64bit로 다운받아 보세요 다운받으시고 컴퓨터 재시작하시구요.. 그리고 실행한번해보세요 그래도안되시면 32bit로 포맷하심이..... 제 생각엔 이게 window가 32bi일때만 돌아가는거같은데... 물론 아닐수도잇지만요.. 가장 확실한방법은 window 32bit로 포맷하고 위에 나온 방법으로 설치다시하면 될겁니다 그리고 꼭!! 컴퓨터 재부팅해주세요 .. 화이팅요..
제가 쓰고있는 컴퓨터의 환경이 Win7 32bit라 따로 Win7 64bit 환경에 따른 실행여부를 테스트해 보지 못했습니다. 아마 Win7 64bit를 쓰고계시다면 프로세싱 32bit로 설치하여도 똑같은 결과를 보일것이라고 생각합니다. OpenCV가 C기반으로 작동되는 라이브러리이기 때문에 Java기반으로 만든 Processing에서는 실행시키기에 제약사항이 많습니다.(위의 실행시킨 OpenCV의 버전도 현재 버전과는 많이 다른 오래된 버전인 1.0입니다) 외국사이트를 찾아본 결과 Java용 OpenCV인 JavaCV를 통해 Processing에서 OpenCV를 실행시킬 수 있다고(Win7 64Bit 포함) 하는데 JavaCV안의 SampleCode에는 FaceDetection이란 예제가 빠져있는듯 합니다. 일단은 32Bit에서만 위의 코드가 구동이 되는거 같고 64bit에서의 실행여부는 찾아보고 난 뒤 실행된다면 다시 글 올리겠습니다.
외국사이트를 통해 Win7 64Bit컴퓨터의 Processing에 JavaCV설치를 통해 OpenCV의 구동이 되는것을 예제로 확인하였습니다. 하지만 이 JavaCV라이브러리에 영상인식방법 중 하나인 Haar_cascade가 없는지 기존 FaceDetection예제에 Import위치를 JavaCV쪽으로 바꿔서 해도 Haar_cascade를 찾을 수 없다는 메시지 때문에 결국 얼굴인식은 하지 못하였습니다. Processing보다는 많이 번거롭지만(?!) Visual Studio를 사용하여 C와 OpenCV를 통해 충분히 얼굴인식을 할 수 있습니다. (예전 기억으로는 64bit컴퓨터에서 C를 통해 얼굴인식을 해본 기억이 있습니다) 시간이 된다면 C와 OpenCV를 사용하여 이 프로젝트를 다시 작성하여 올리겠습니다.
32bit로 해서 실행을 잘 했는데
example로 해서 face-detecting을 실행 시켰습니다.
근데여기서 캠 화면은 뜨는데 사각 틀이 만들어지지 않네요 ㅜㅜ
어떡하죠 ?
그
프로세싱에서 Rectangle을 그려주는 구문은 아래와 같습니다.
noFill(); //채우기 없음 stroke(0, 255, 0); //R:0, G:255, B:0 녹색의 사각형을 그린다. strokeWeight(5); //사각형의 테두리는 5로 지정한다 for(int i = 0; i < faces.length; i++) { rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); }
위의 구문이 존재하는한 faces[]가 존재한다면 사각형은 필연적으로 그려지게 되는데
그려지지 않는다는 것은
Rectangle[] faces = opencv.detect(1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40);
여기서 OpenCV를 통해 얼굴을 인식하지 못한다는거와 같습니다.
GSVideo안의 OpenCV폴더에서 faceDetection을 실행하신게 맞으신지
haarcascade_frontalface_alt.xml파일을 저장된 프로세싱 경로에 있는 data폴더안에 넣어보셨는지
openCV를 설치하셨는지 확인 부탁드릴게요.
Ractangle을 그려주는 구문이 있음에도 컴파일 에러없이 소스가 실행되어 웹캠화면이 떴다면 OpenCV쪽에서 문제가 있다는 거니 OpenCV쪽 세팅과정에서 문제를 찾을 수 있을거라고 봐요.
안녕하세요 수박쨈님이 공유해 주신 프로젝트에 흥미가 있어서 따라 해 보았는데요
아직 초보자라 그런지 문제점이 많아서 질문드립니다.
현재 웹캠을 화면에 띄운 후에 사각형이 나타나지 않네요 폴더의 경로도 확인해 보고
OpenCV설치 여부도 다시 한번 확인 해 봤는데 이상이 없는거 같아요.
마지막으로 OpenCV세팅을 다시 점검하려고 하는데 구체적인 세팅 내용을 알 수 있을까요?
환경변수에서 bin폴더 까지 입력 완료 했는데 다른 세팅이 있을까요?
@최광진 위의 댓글을 읽어보시면 아시겠지만 32bit에서 실행시켜보았습니다. 64bit에서 실행시켜보니 OpenCV가 1.0버전이라 그런지 프로세싱에서 faceDetection이 제대로 실행되지 않네요...
진짜 64bit컴퓨터에서 사용하고 싶으시다면 아마 VisualStudio를 설치하셔서 C를 통해 최신버전 OpenCV를 가지고 사용하셔야 할 듯 합니다.
예전에 C에서 openCV를 가지고 아두이노와 연동해 본적이 있는데 그때는 64bit였던걸로 기억합니다.
안녕하세요 전기과학생입니다! 위에 올려주신 아두이노 소스로 모터도 돌렸고, 또 올려주신 프로세싱코드로 얼굴 인식하는 것 까지는 했습니다. 그런데 인식되는게 옮겨갈때마다 모터가 돌아가야하는데 아무런 반응이 없네요 ㅠㅠ
뭐가 잘못된걸까요?
@이재광 위의 소스를 그대로 사용하셨는데 안되는건가요?
각각의 독립적인 시스템이 작동하는데 두 시스템을 연동했을때 작동하지 않는다면 커뮤니케이션에 문제가 있을 확률이 높습니다.
32비트 환경에서 64비트 환경에서 작동한다는 에러는 최초 폴더명을 영문으로 바꾸었을때 해결이 되었습니다.
영상윈도우 창에 사각형 태두리가 나타나지 않는 현상은 xml 파일을 data 파일이 아닌 그 상위 폴더 내 저장했더니 해결하였습니다.
GSVideo version: 1.0.0
[opencv fatal error] library not loaded !
THIS VERSION OF OPENCV LIBRARY REQUIRE ADDITIONAL DEPENDENCIES.
READ THE INSTALLATION INSTRUCTIONS AT http://ubaa.net/shared/processing/opencv/
Verify that the '\path\to\OpenCV\bin' exists in your system PATH and the java.library.path property is correctly.
error message: C:\Users\eric\Desktop\processing-2.2.1-windows32\processing-2.2.1\modes\java\libraries\opencv\OpenCV\library\OpenCV.dll: Can't find dependent libraries
A library relies on native code that's not available.
Or only works properly when the sketch is run as a 64-bit application.
저는 32비트 윈도우7을 사용중인데 이러한 내용이 나오네요 ;;;
opencv는 씨에 설치하여 경로성정을 했고 나머지도 전부 그대로 따라했는데 실행이 안되네요 ?ㅠㅠㅠ
질문이 있습니다. 비슷한 프로젝트를 생각중인 학생인데요.
캠을 아두이노에 연결해서 실시간으로 데이터를 컴퓨터로 전송해서 컴퓨터에서 스트리밍된 데이터로 얼굴인식을 해서 움직여 지는 정보를 받나요 아니면 캠은 pc에서 바로 연결되있고 (선만) 구성은 서보모터 위에 붙어있는건가요
캠은 피씨랑 연결돼 있고 컴퓨터의 설치된 OpenCV에서 얼굴 인식에 관련된 값을 계산합니다.
그 후 스크린의 중앙 좌표값과 비교하여 서보모터를 어디로 움직이라는 지시를 아두이노쪽으로 시리얼 통신을 통해 보내게 됩니다.
그러면 아두이노에서는 그 데이터를 받아 서보모터를 제어합니다.
위 프로젝트에서는 아두이노는 단지 들어오는 값에 따라 서보모터를 움직이기 위한 제어보드라고 생각하시면 됩니다.
모터의 떨림 현상이 어떻게 일어나는지 모르겠네요.
애초에 서보모터는 자체적으로 떨림현상이 있기 때문에 이 떨림 현상을 말하시는 것이라면 사실 해결이 불가능한거 같습니다.
이게 아니라면 중앙을 잡고 있을때 흔들흔들 거리는것을 말하는 것을 같은데 그럴땐 인식할 수 있는 중앙의 범위를 늘려주시면 될거 같습니다.(중앙 범위가 좁으면 모터가 조금만 인식해도 중앙을 벗어나는 것으로 인식해 계속적으로 중앙에 들어오기 위해 움직이는 경우가 있습니다.)
예제를 돌려보면
GSVideo version: 1.0.0
Could not run the sketch (Target VM failed to initialize).
For more information, read revisions.txt and Help → Troubleshooting.
라고 뜨면서 실행화면에 아무것도 뜨지않고 응답없음이 뜹니다.
어떻게 해결방법없을까요?
Could not run the sketch (Target VM failed to initialize).
For more information, read revisions.txt and Help → Troubleshooting.
계속해서 이런식으로 뜨는데 어떻게 하면 이런방법을 해쳐나갈수있는지 여쭤보아도 될까요
Forbidden
You don't have permission to access /shared/processing/opencv/download/opencv.zip on this server.
opencv파일 다운시 이렇게 뜨면서 다운이 안됩니다. 다시 올려주심 안될까요? 죄송합니다.
대학교 전시 작품으로 아두이노와 프로세싱을 활용한 조형물을 만들고 있는데
이 내용이 꼭 필요합니다...
open cv라이브러리 버전이 뭔지 꼭 알고 싶은데 답변 부탁드립니다..
저도 라이브러리 파일이 forbidden이 뜨면서 다운을 못하는 중입니다... 일단 비슷하게라도 구글에서 외국사이트를 통해 64bit OpenCV 라이브러리 파일을 다운받긴 했습니다. 하지만 가장 큰 문제로 The package “hypermedia” does not exist. You might be missing a library. 문제로 위의 댓글에 해답처럼 OpenCV라이브러리 폴더안에서 Hypermedia폴더가 존재하지 않네요... 해답이 있으면 꼭 답변 부탁드리겠습니다.....
파이리가 2014-11-09 22:26:19
안녕하세요. 얼굴추적을 공부하고 있는 학생인데
facedectection 을 실행하면 hypermedia가 없다고
나오는데 어떻게 해야할지 모르겠네요 ㅜㅜ