문제: opencv의 FileStorage class를 이용하여 파일을 출력시, 어느 정도 되다가 Microsoft C++ exception: cv::Exception at memory location 와 같은 에러창을 내면서 죽음.
해결:
<http://www.itgo.me/a/x3069773210788729692/opencv-filestorage-error>에 따르면 보통 cv::Exception 에러는 debug mode에서 release라이브러리를 혹은 그 반대를 적용하는 경우 발생한다고 한다. 또한 라이브러리의 버전도 현재 사용하고있는 개발 환경과(VS2010, VS2012같은) 맞춰야한다.
참고로
VS2012 - vc12
VS2010 - vc10
VS2008 - vc9
이다.
즉,
1. debug모드에서는 debug라이브러리와 dll을, release모드에서는 release라이브러리와 dll을 사용해야함.
2. 프로젝트->속성->General->Platform Toolset->의 값이 opencv의 build된 폴더명과 같은것을 사용하는지(lib, dll) 확인한다.
2017년 2월 1일 수요일
CMake를 이용하여 OpenCV 새로 빌드하기
문제: CMake를 이용하여 OpenCV를 새로 빌드하자.
해결:
<참조: http://it4all.tistory.com/18>
OpenCV를 다운로드 받는다.
CMake를 다운로드받고 설치한다.
CMake에서
'Where is the source code':에 opencv에서 CMakeLists.txt가 있는 폴더를 설정한다(주로 sources)이다.
'Where to build the binaries':에는 결과를 저장할 폴더를 설정한다.
Configure -> 맞는 개발툴을 선정(ex: VS2013)
결과를 보고 수정을 원하는 옵션은 수정한다.
ex) WITH_OPENNI -> 체크
수정하였다면 다시 Configure를 누른다. 그러면 변화된 옵션에 맞게 결과가 바뀐다(적색). 결과가 맞다면 다시 Configure를 눌러서 적색이 없게끔 만든다. 또한 결과창에 원하는 옵션이 Yes인지 확인한다. 모든 것이 맞다면 Generate를 누른다.
VS에서 OpenCV.sln을 열고 ALL_BUILD 솔루션을 선택하여 빌드한다. 빌드가 완료되면 DEBUG/RELEASE모드로 각각 빌드한 후, 사용한다.
에러:
fatal error C1189: #error : Xiron Platform Abstraction Layer - Win32 - Microsoft Visual Studio versions above 2010 (10.0) are not supported!
해결:
VS2010까지만 허용된다.
2017년 1월 25일 수요일
Asus Xtion Pro 드라이버 설치하기 & OpenCV를 이용하여 영상 받아들이기
문제: Asus Xtion Pro driver를 설치해보자. & Opencv를 이용하여 영상을 받아보자.
해결:
<참고: https://fivedots.coe.psu.ac.th/~ad/kinect/installation.html>
<참고: http://answers.opencv.org/question/21716/run-asus-xtion-with-highgui-howto/>
1. 일단 컴퓨터의 프로그램(제어판->프로그램->프로그램 및 기능)에서 primesense, openni, kinect, xbox, nite가 언급된 모든 드라이버를 깨끗하게 삭제한다.
2. program files/primesens 폴더와 openNI폴더를 삭제한다.
3. 재부팅
4. 다음 페이지에서 OpenNI 패키지,XtionStore installer, Xtion Pro driver&SDK 패키지를 다운받는다.
https://www.asus.com/3D-Sensor/Xtion_PRO_LIVE/HelpDesk_Download/
5. 설치( 후 재부팅.
6. NiViewer.exe를 실행시켜 정상동작을 확인한다.
7. OpenCV를 이용하기전 유의문과 예문을 확인한다.
http://docs.opencv.org/2.4/doc/user_guide/ug_kinect.html
8. OpenCV에 OpenNI를 사용할 수 있도록 빌드되었는지 아래 함수로 확인한다.
cout << cv::getBuildInformation() << endl;
를 넣으면 opencv에 rgbd를 받도록 빌드되었는 확인가능함.
9. 만약 no라면 OpenCV에서 OpenNI가 가능하게끔 다시 빌드해야한다. yes라면 다음 구문을 넣어 테스트한다.
printf("%s\n", cv::getBuildInformation().c_str()); // 현재 opencv의 여러설정들을 보여줌(여기에는 openni가 사용가능한지도 있음).
// Open Kinect sensor
cv::VideoCapture capture(CV_CAP_OPENNI_ASUS);
if (!capture.isOpened()) {
_cprintf("Could not open OpenNI-capable sensor\n");
}
capture.set(CV_CAP_PROP_OPENNI_REGISTRATION, 1);
double focal_length = capture.get(CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH);
// Main loop
cv::Mat _color, _depth;
for (;;)
{
// Capture next color/depth pair
capture.grab();
capture.retrieve(_depth, CV_CAP_OPENNI_DEPTH_MAP);
capture.retrieve(_color, CV_CAP_OPENNI_BGR_IMAGE);
cv::imshow("color", _color);
cv::imshow("depth", _depth);
cv::waitKey(10);
}
해결:
<참고: https://fivedots.coe.psu.ac.th/~ad/kinect/installation.html>
<참고: http://answers.opencv.org/question/21716/run-asus-xtion-with-highgui-howto/>
1. 일단 컴퓨터의 프로그램(제어판->프로그램->프로그램 및 기능)에서 primesense, openni, kinect, xbox, nite가 언급된 모든 드라이버를 깨끗하게 삭제한다.
2. program files/primesens 폴더와 openNI폴더를 삭제한다.
3. 재부팅
4. 다음 페이지에서 OpenNI 패키지,
https://www.asus.com/3D-Sensor/Xtion_PRO_LIVE/HelpDesk_Download/
5. 설치( 후 재부팅.
6. NiViewer.exe를 실행시켜 정상동작을 확인한다.
7. OpenCV를 이용하기전 유의문과 예문을 확인한다.
http://docs.opencv.org/2.4/doc/user_guide/ug_kinect.html
8. OpenCV에 OpenNI를 사용할 수 있도록 빌드되었는지 아래 함수로 확인한다.
cout << cv::getBuildInformation() << endl;
를 넣으면 opencv에 rgbd를 받도록 빌드되었는 확인가능함.
9. 만약 no라면 OpenCV에서 OpenNI가 가능하게끔 다시 빌드해야한다. yes라면 다음 구문을 넣어 테스트한다.
printf("%s\n", cv::getBuildInformation().c_str()); // 현재 opencv의 여러설정들을 보여줌(여기에는 openni가 사용가능한지도 있음).
// Open Kinect sensor
cv::VideoCapture capture(CV_CAP_OPENNI_ASUS);
if (!capture.isOpened()) {
_cprintf("Could not open OpenNI-capable sensor\n");
}
capture.set(CV_CAP_PROP_OPENNI_REGISTRATION, 1);
double focal_length = capture.get(CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH);
// Main loop
cv::Mat _color, _depth;
for (;;)
{
// Capture next color/depth pair
capture.grab();
capture.retrieve(_depth, CV_CAP_OPENNI_DEPTH_MAP);
capture.retrieve(_color, CV_CAP_OPENNI_BGR_IMAGE);
cv::imshow("color", _color);
cv::imshow("depth", _depth);
cv::waitKey(10);
}
2016년 4월 25일 월요일
Point Cloud Library 사용시 주의점
using namespace cv;
using namespace std;
using namespace pcl;
같은 걸 많이 쓰는데
opencv나 pcl안에 같은 이름으로 정의된 class들이 존재함. ex) flann
즉 flann이 컴파일 될 때, 위와같이 namespace를 써버리면 cv것인지 pcl것이 모르기에 에러를 냄.
그렇기에 using namespace를 안쓰는 것이 귀찮더라도 에러를 안낼 수 있는 방법임.
2016년 4월 20일 수요일
Visual Studio에서 영상 디버깅하기
디버깅창에서 이미지를 보여주는 플러그인
Opencv 이미지타입 지원.
vs2012 이상만 지원.
https://visualstudiogallery.msdn.microsoft.com/e682d542-7ef3-402c-b857-bbfba714f78d
설치한 후, 보기->다른창->Image Watch를 쓰면 된다. 특히, Image Watch에서 마우스 우클릭하여 Auto Contrast를 하면 편하게 화면을 볼 수 있다.
설치한 후, 보기->다른창->Image Watch를 쓰면 된다. 특히, Image Watch에서 마우스 우클릭하여 Auto Contrast를 하면 편하게 화면을 볼 수 있다.
opencv Mat 저장하기 (CV32FC1과 같이 UINT가 아닌 경우)
opencv에서 보통은 아래와같이 읽고, 저장한다.
Mat matImage = imread("asdf.png", IMREAD_UNCHANGED);
imwrite("asdf.png", matImage);
그런데 위의 경우는 주로 Mat의 element가 uint인 경우이다(depth는 1, 2, 3이든...)
하다보면 float인 경우가 있는데 이럴 때는
1. Mat의 포맷은 uint로 바꾸거 위 방법으로 저장하든,
2. FileStorage Class를 사용해야한다.
2의 방법을 사용하는 법은 아래와 같다. 이때는 이미지 포맷이 아닌 xml 혹은 yaml로 저장해야한다(확장자가).
저장할 때,
cv::FileStorage fs_w("asdf.xml", cv::FileStorage::WRITE);
fs_w << "matImage" << matImage;
fs_w.release();
// fs_w << "matImage" << matImage << "변수명" << 변수 <<... // 만약 변수가 더있다면
불러올 때,
cv::FileStorage fs_r("asdf.xml", cv::FileStorage::READ);
// 방법1(Mat이 아닌 type인 경우).
int a = (int)fs_r["a"];
// 방법2(Mat인 경우).
Mat matImage;
fs_r["matImage"] >> matImage;
fs_r.release();
<출처: http://docs.opencv.org/2.4/modules/core/doc/xml_yaml_persistence.html>
사실 위 기능은 iostream과도 유사한데 속도면에서 더 빠르다고 한다.(약 50~60%정도)
<출처: http://stackoverflow.com/questions/16312904/how-to-write-a-float-mat-to-a-file-in-opencv>
Mat matImage = imread("asdf.png", IMREAD_UNCHANGED);
imwrite("asdf.png", matImage);
그런데 위의 경우는 주로 Mat의 element가 uint인 경우이다(depth는 1, 2, 3이든...)
하다보면 float인 경우가 있는데 이럴 때는
1. Mat의 포맷은 uint로 바꾸거 위 방법으로 저장하든,
2. FileStorage Class를 사용해야한다.
2의 방법을 사용하는 법은 아래와 같다. 이때는 이미지 포맷이 아닌 xml 혹은 yaml로 저장해야한다(확장자가).
저장할 때,
cv::FileStorage fs_w("asdf.xml", cv::FileStorage::WRITE);
fs_w << "matImage" << matImage;
fs_w.release();
// fs_w << "matImage" << matImage << "변수명" << 변수 <<... // 만약 변수가 더있다면
불러올 때,
cv::FileStorage fs_r("asdf.xml", cv::FileStorage::READ);
// 방법1(Mat이 아닌 type인 경우).
int a = (int)fs_r["a"];
// 방법2(Mat인 경우).
Mat matImage;
fs_r["matImage"] >> matImage;
fs_r.release();
<출처: http://docs.opencv.org/2.4/modules/core/doc/xml_yaml_persistence.html>
사실 위 기능은 iostream과도 유사한데 속도면에서 더 빠르다고 한다.(약 50~60%정도)
<출처: http://stackoverflow.com/questions/16312904/how-to-write-a-float-mat-to-a-file-in-opencv>
2016년 4월 18일 월요일
opencv imshow 혹은 namedWindow에서 창이 반복되고 타이틀이 망가지는 경우.
1. 먼저 opencv library 제대로 링크해본다.
- 디버그는 디버그로, 릴리즈는 릴리즈로
#if _DEBUG
#pragma comment(lib, "opencv_core2411d.lib")
#pragma comment(lib, "opencv_imgproc2411d.lib")
#pragma comment(lib, "opencv_highgui2411d.lib")
#pragma comment(lib, "opencv_video2411d.lib")
#else
#pragma comment(lib, "opencv_core2411.lib")
#pragma comment(lib, "opencv_imgproc2411.lib")
#pragma comment(lib, "opencv_highgui2411.lib")
#pragma comment(lib, "opencv_video2411.lib")
#endif
2. preprocessor에 _ITERATOR_DEBUG_LEVEL=0 추가해본다.
Properties: c\c++ -> preprocessor: ‘Preprocessor Definitions’
_ITERATOR_DEBUG_LEVEL=0
<ref: http://stackoverflow.com/questions/20854682/opencv-multiple-unwanted-window-with-garbage-name>
<ref: http://answers.opencv.org/question/3746/string-text-is-garbage-on-cvimshow-title-bar-and-in-cvputtext-display/>
- 디버그는 디버그로, 릴리즈는 릴리즈로
#if _DEBUG
#pragma comment(lib, "opencv_core2411d.lib")
#pragma comment(lib, "opencv_imgproc2411d.lib")
#pragma comment(lib, "opencv_highgui2411d.lib")
#pragma comment(lib, "opencv_video2411d.lib")
#else
#pragma comment(lib, "opencv_core2411.lib")
#pragma comment(lib, "opencv_imgproc2411.lib")
#pragma comment(lib, "opencv_highgui2411.lib")
#pragma comment(lib, "opencv_video2411.lib")
#endif
2. preprocessor에 _ITERATOR_DEBUG_LEVEL=0 추가해본다.
Properties: c\c++ -> preprocessor: ‘Preprocessor Definitions’
_ITERATOR_DEBUG_LEVEL=0
<ref: http://stackoverflow.com/questions/20854682/opencv-multiple-unwanted-window-with-garbage-name>
<ref: http://answers.opencv.org/question/3746/string-text-is-garbage-on-cvimshow-title-bar-and-in-cvputtext-display/>
2016년 3월 8일 화요일
Image Watch, visual studio에서 opencv의 mat의 내용을 debugging하면서 볼 수 있게 해주는 프로그램
문제: Visual Studio에서 opencv의 mat의 내용을 디버깅시에 보고싶다.
해결:
Image Watch라는 확장프로그램으로 깔면 됨.
설명
http://docs.opencv.org/2.4/doc/tutorials/introduction/windows_visual_studio_image_watch/windows_visual_studio_image_watch.html
다운로드 링크
https://visualstudiogallery.msdn.microsoft.com/e682d542-7ef3-402c-b857-bbfba714f78d?tduid=(fcdab6d2cfd3f23d0984fc672e8fbce7)(256380)(2459594)(je6NUbpObpQ-Z7ZbIM7Ie1T98TKXF9Cdhw)()
사용
디버깅모드에서 보기->다른창->Image Watch를 선택하면 됨.
위치와 값을 볼 수 있음
해결:
Image Watch라는 확장프로그램으로 깔면 됨.
설명
http://docs.opencv.org/2.4/doc/tutorials/introduction/windows_visual_studio_image_watch/windows_visual_studio_image_watch.html
다운로드 링크
https://visualstudiogallery.msdn.microsoft.com/e682d542-7ef3-402c-b857-bbfba714f78d?tduid=(fcdab6d2cfd3f23d0984fc672e8fbce7)(256380)(2459594)(je6NUbpObpQ-Z7ZbIM7Ie1T98TKXF9Cdhw)()
사용
디버깅모드에서 보기->다른창->Image Watch를 선택하면 됨.
위치와 값을 볼 수 있음
2015년 12월 23일 수요일
python, PIL과 opencv에서 image read시 RGB순서
cv = [15, 23, 22], [14, 22, 21]...
PIL= [22, 23, 15], [21, 22, 14]...
PIL은 RGB 순으로, cv는 BGR순으로 읽는다.
2015년 11월 30일 월요일
python에서 opencv활용하기
1. opencv를 설치
>> sudo apt-get install libopencv-dev
2. python에서 opencv쓸수 있게 해주는 부분 설치
>> sudo apt-get install python-opencv
3. 설치확인하여 에러안내고 되면 OK.
>> python
>> import cv2
4. 만약 안되면 관련 파일들의 위치를 확인하고 경로를 추가해준다.
>> find / -name "cv.py"
>> find / -name "cv2.so"
ex)
/usr/lib/python2.7/dist-packages/cv.py
/usr/lib/python2.7/dist-packages/cv2.so
4.1 python코드에 추가하는 방법
import sys
sys.path.append('/usr/lib/python2.7/dist-packages')
4.2 profile에 추가하는 방법
sudo vi /etc/profile
export PYTHONPATH=/usr/lib/python2.7/dist-packages:$PYTHONPATH
<참조: http://jnakim.com/94>
<참조: http://stackoverflow.com/questions/15790501/why-cv2-so-missing-after-opencv-installed>
>> sudo apt-get install libopencv-dev
2. python에서 opencv쓸수 있게 해주는 부분 설치
>> sudo apt-get install python-opencv
3. 설치확인하여 에러안내고 되면 OK.
>> python
>> import cv2
4. 만약 안되면 관련 파일들의 위치를 확인하고 경로를 추가해준다.
>> find / -name "cv.py"
>> find / -name "cv2.so"
ex)
/usr/lib/python2.7/dist-packages/cv.py
/usr/lib/python2.7/dist-packages/cv2.so
4.1 python코드에 추가하는 방법
import sys
sys.path.append('/usr/lib/python2.7/dist-packages')
4.2 profile에 추가하는 방법
sudo vi /etc/profile
export PYTHONPATH=/usr/lib/python2.7/dist-packages:$PYTHONPATH
<참조: http://jnakim.com/94>
<참조: http://stackoverflow.com/questions/15790501/why-cv2-so-missing-after-opencv-installed>
피드 구독하기:
글 (Atom)