본문 바로가기
Programming/Sensors

ros opencv usb camera

by OKOK 2017. 8. 8.

1. 2D data point


2. lidar 3d data point


3. lidar + camera image


4. ros 내에서 해야 하는 것인가


5. ros 를 사용하는 이유는 무엇인가.


6. 코드를 재사용 할 수 있다는 장점


윈도우에서 vs 를 활용하여, 저장된 이미지에서의 좌표값을 얻었습니다. 그리고 다음으로는 우분투에서 좌표값을 얻어 내는 것을 해보겠습니다. 


우분투에서 opencv 실행하기. 


http://webnautes.tistory.com/1030


ubuntu 16.04 에 opencv_contrib 포함하여 opencv3.2 설치

기존 설치된 패키지 업그레이드 설치해주기 전에 기존에 설치된 패키지들을 업그레이드 해주기 위한 작업입니다. 우부투 저장소로부터 패키지 리스트를 업데이트 합니다. 기존에 설치된 패키지들의 새로운 버전이 저장소에 있다면 리스트를 업데이트 하기 위해 실행합니다. 기존에 설치된 패키지의 새로운 버전이 있으면 업그레이드를 진행합니다. 


http://webnautes.tistory.com/1030

unzip opencv_contrib.zip

opencv 컴파일 전 필요한 패키지 설치

opencv를 컴파일하는데 사요하는 것들이 포함된 패키지들을 설치합니다. bould-essential 패키지에는 C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함되어 있습니다. 


pkg-config 는 프로그램 컴파일 및 링크시 필요한 라이브러리에 대한 정보를 메타파일로부터 가져오는데 사용되빈다. 확장자가 .pc 인파일 터미널에서 특정 라이브러리를 사용한 소스코드를 컴파일시 필요한 컴파일러 및 링커플래그를 추가하는데 도움이 됩니다. 


리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함하고 있습니다. GStreamer는 비디오 스트리밍을 위한 라이브러리입니다. 


openGL 지원하기 우해 필요한 라이브러리입니다. OpenCV 최적화를 위해 사용되는 라입러리들 입니다.


OpenCV 설정과 컴파일 및 설치 소스코드를 저장할 임시 디렉토리를 생성하여 이동 후, 진행합니다. 소스코드를 다운로드 받아 압출을 출어줍니다. 소스코드를 다운로드 받아 압축을 풀어줍니다. SIFT, SURF 등을 사용하기 위해 필요합니다. 다음처럼 두 개의 디렉토리가 생성됩니다. opencv-3.2.0 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동합니다. 컴파일은 build 디렉토리에서 이루어집니다.


cmake를 사용하여opencv 컴파일 설정을 해줍니다. 메시지가 보이면 정상적으로 된 것 입니다. python 2 라이브러리 항목이 보이지 않는 경우에는 다음 붉은색 줄처럼 해당 경로들을 직접 적어줘야 합니다. 컴파일을 시작하기 전에 사용 중인 컴퓨터의 CPU 코어 수를 확인합니다. make 명령을 사용하여 컴파일을 시작합니다. -j 다음에 위에서 확인한 숫자를 붙여서 실행해줍니다. 컴파일시 걸리는 시간을 확인하기 위해 명령 앞에 time을 붙여주어 실행했습니다. 


컴파일 결과물을 설치합니다. etc/ld.so.conf.d/ 디렉토리에 /usr/local/lib를 포함하는 설정파일이 있는지 확인합니다. 


예제파일 원하는 것을 가져오고 사용방안에 따라서 컴파일 후 실행하면 됩니다. 컴파일 하는 방법은 

g++ -o facedetect facedetect.cpp $(pkg-config --libs --cflags opencv)  


g++ -o filename filename.cpp $same


인듯 합니다. 화면에서 마우스 콜백 함수를 한 번 사용해보도록 하겠습니다. 

그러면 실제 사진 데이터를 가지고 좌표를 총 마름모 하나당 4개의 좌표가 나오니, 3개의 데이터 셋을 가지고 총 12개의 이미지 상의 데이터를 가지고 있도록 하겠습니다. 그리고 돌아가는 화면에서 실행을 해야 하니, 실시간으로 돌아가는 부분에서 확인 해보도록 하겠습니다. 



이 화면에 대한 값들이 나옵니다.

가장 아래 3개는 삼각형의 모서리를 클릭한 것입니다. x 는 오른쪽으로, y는 아래로 갈수록 숫자가 커집니다.

지금 마우스로 클릭하는 것에 집중하는 것이 아니라, 하나의 윈도우에서 2개의 영상이 겹치도록 하는 것이 주된 업무입니다. 


실시간으로 이동하기 전에 멈춘 상태에서 입히는 것을 한번 찾아보도록 하겠습니다. 


사용할 수 있는 예제를 가져와서 파일을 열어본 후 데이터를 넣습니다. 지금 캐니에지를 사용한 결과는 다음과 같습니다.


마우스 클릭하여 데이터를 얻는 것을 ros에 구현하기. 엮여있는 환경 변수가 가장 문제일 것 같은데 한번 ros_node 를 열어보면 좋을 것 같습니다. 



47번째 사진파일 이미지 출력을 해보았습니다. 동영상 파일 출력도 별반 다를 것이 없어 보입니다.

#include <opencv\highgui.h>

int main() {
	IplImage *frame;
	
	CvCapture* capture = cvCaptureFromCAM(0);

	cvNamedWindow("Test",1);
	
	while(capture) {
		frame = cvQueryFrame(capture);
		cvShowImage("Test",frame);

		if(cvWaitKey(33) >= 27)
			break;
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("Test");

	return 0; 

} 


출처:http://dsnight.tistory.com/21


실제로 데이터를 올리기전에 M값을 구해서 값을 찾을 수 있을 것 같은데, 그럼 카메라를 이용해서 사진을 찍은 다음에, 그것을 실제 센서값과 비교를 해보도록 합니다. 최소 3m 이상이니, 데이터를 어디서 받아야하지 여기에서 받기에는 무리가 있을 것 같다는 생각이 듭니다. 아니면 정확하게 정수기의 모서리를 중심으로 해보도록 하겠습니다. 문을 해도 됩니다.


오픈소스 코드 사용하면 하나의 윈도우에 같이 올릴 수 있을 것 같다는 생각이 듭니다. 사실 지금 gopro 연결안해도 상관없습니다. 이번에 안되면 패스하도록 합니다.