지금 사용하고 있는 opencv 버전의 설치 위치인
D:\opencv 2.4.9\build\python\2.7\x86
에 있는
cv2.pyd 파일을 다음 위치로 복사한다.
C:\Python27\Lib\site-packages
Python IDLE에서
>>import cv2
특별한 함수가 설치되었는지 유무는
>>help(cv2.SIFT())
또는
>>help(cv2)
등으로 체크할 수 있다.
참고
[1] http://imky.egloos.com/2969966
2014년 12월 22일 월요일
2014년 12월 1일 월요일
OpenCV - Color image In/Out
#pragma once
#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace std;
using namespace cv;
// Write grayscale image
void WriteIm(String str, unsigned char* im, const Size& sz)
{
Mat bIm = Mat(sz.height, sz.width, CV_8UC1, im);
imwrite(str, bIm);
}
void main()
{
Mat image = imread("face.jpg");
if (image.empty()) return;
cv::Size sz = image.size();
// hsl channel split
Mat hsl;
cvtColor(image, hsl, CV_RGB2HLS);
Mat hslChannels[3];
split(hsl, hslChannels);
unsigned char *im_l = hslChannels[1].ptr<unsigned char>();
unsigned char *im_h = hslChannels[0].ptr<unsigned char>();
unsigned char *im_s = hslChannels[2].ptr<unsigned char>();
// rgb channel split
Mat rgbChannels[3];
split(image, rgbChannels);
unsigned char *im_r = rgbChannels[0].ptr<unsigned char>();
unsigned char *im_g = rgbChannels[1].ptr<unsigned char>();
unsigned char *im_b = rgbChannels[2].ptr<unsigned char>();
// access image pointer
for(int i=0; i<sz.height; i++)
{
for(int j=0; j<sz.width; j++)
{
im_r[i*sz.width+j] = 255 - im_r[i*sz.width+j];
}
}
// Write image
WriteIm("inv_red.jpg", im_r, sz);
waitKey();
}
#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace std;
using namespace cv;
// Write grayscale image
void WriteIm(String str, unsigned char* im, const Size& sz)
{
Mat bIm = Mat(sz.height, sz.width, CV_8UC1, im);
imwrite(str, bIm);
}
void main()
{
Mat image = imread("face.jpg");
if (image.empty()) return;
cv::Size sz = image.size();
// hsl channel split
Mat hsl;
cvtColor(image, hsl, CV_RGB2HLS);
Mat hslChannels[3];
split(hsl, hslChannels);
unsigned char *im_l = hslChannels[1].ptr<unsigned char>();
unsigned char *im_h = hslChannels[0].ptr<unsigned char>();
unsigned char *im_s = hslChannels[2].ptr<unsigned char>();
// rgb channel split
Mat rgbChannels[3];
split(image, rgbChannels);
unsigned char *im_r = rgbChannels[0].ptr<unsigned char>();
unsigned char *im_g = rgbChannels[1].ptr<unsigned char>();
unsigned char *im_b = rgbChannels[2].ptr<unsigned char>();
// access image pointer
for(int i=0; i<sz.height; i++)
{
for(int j=0; j<sz.width; j++)
{
im_r[i*sz.width+j] = 255 - im_r[i*sz.width+j];
}
}
// Write image
WriteIm("inv_red.jpg", im_r, sz);
waitKey();
}
2013년 10월 31일 목요일
OpenCV에서 cv::Mat 의 사용
최신 버전의 opencv에서 제공하는 C++ 인터페이스를 사용하자. C인터페이스에 비해 사용이 쉽고, 안전하며, 메모리 관리가 용이하다.
유사한 작업을 할 때 작성해야 하는 코드의 양도 작다.
예로 Mat 클래스를 살펴보자. opencv에 있는 imread 함수는 (cvMat타입이 아니라) Mat타입을 리턴한다.
cvMat는 C언어 인터페이스, Mat는 C++ 인터페이스이다.
(예제) 이미지를 읽고 일부분을 떼어 낸다.
cv::Mat image = imread("face.jpg");
if(image.empty()) return;
cv::imshow("face", image);
cv::Mat bw = image > 128; // threshold image into binary
cv::Mat crop = image(cv::Rect(50,50,150,200)); // 100x150 크기의 부분 이미지
crop = 0; // set image to 0
cv::waitKey();
코드가 직관적이고 단순하다.
예제에서 모든 이미지 행렬 할당은 같은 데이터를 가리킨다. 따라서 crop 행렬을 0으로 만들면 image의 해당 부분을 0으로 만들어 버린다. 따라서 데이터의 새로운 복사본을 만드는 것이 필요하다. Mat::copyTo나 Mat::clone()을 사용한다.
만일 상기한 예제를 C 인터페이스로 작성하였다면 아래와 같다.
IplImage* pImg= CvLoadImage("face.jpg");
if(pImg==NULL) return;
....
CvShowImage("face", pImg);
cvWaitKey();
CvReleaseImage(&pImg); // release the assigned memory
...
더 복잡하고 메모리 해제를 직접 해 주어야 한다.
유사한 작업을 할 때 작성해야 하는 코드의 양도 작다.
cvMat는 C언어 인터페이스, Mat는 C++ 인터페이스이다.
(예제) 이미지를 읽고 일부분을 떼어 낸다.
cv::Mat image = imread("face.jpg");
if(image.empty()) return;
cv::imshow("face", image);
cv::Mat bw = image > 128; // threshold image into binary
cv::Mat crop = image(cv::Rect(50,50,150,200)); // 100x150 크기의 부분 이미지
crop = 0; // set image to 0
cv::waitKey();
코드가 직관적이고 단순하다.
예제에서 모든 이미지 행렬 할당은 같은 데이터를 가리킨다. 따라서 crop 행렬을 0으로 만들면 image의 해당 부분을 0으로 만들어 버린다. 따라서 데이터의 새로운 복사본을 만드는 것이 필요하다. Mat::copyTo나 Mat::clone()을 사용한다.
만일 상기한 예제를 C 인터페이스로 작성하였다면 아래와 같다.
IplImage* pImg= CvLoadImage("face.jpg");
if(pImg==NULL) return;
....
CvShowImage("face", pImg);
cvWaitKey();
CvReleaseImage(&pImg); // release the assigned memory
...
더 복잡하고 메모리 해제를 직접 해 주어야 한다.
2013년 10월 2일 수요일
VS2012에서 OpenCV 설정하기
(1) 먼저 opencv의 설치 버전을 다운 받는다.
최신의 window버전
(2) 이 파일의 압축을 적당한 디렉토리 위치에 푼다.
(3) 압축이 해제된 곳에 여러 sub-directory가 있는데 그 중에서 build가 필요하다.
(4) vs2012를 실행한다.
(5) 필요한 프로젝트를 하나 작성하고 프로젝트의 속성탭을 실행한다.
구성속성->VC++디렉토리->포함 디렉토리
구성속성->VC++디렉토리->라이브러리 디렉토리
최신의 window버전
(2) 이 파일의 압축을 적당한 디렉토리 위치에 푼다.
(3) 압축이 해제된 곳에 여러 sub-directory가 있는데 그 중에서 build가 필요하다.
(4) vs2012를 실행한다.
(5) 필요한 프로젝트를 하나 작성하고 프로젝트의 속성탭을 실행한다.
구성속성->VC++디렉토리->포함 디렉토리
구성속성->VC++디렉토리->라이브러리 디렉토리
부분에
D:\Opencv\opencv 2.4.6\build\include
D:\Opencv\opencv 2.4.6\build\x86\vc11\lib
를 설정한다. 이 때 vs2012버전의 경우에는 vc11의 라이버러리를 설정한다.
구성속성->링커->입력->추가 종속성
부분에
opencv_core243d.lib
opencv_imgproc243d.lib
opencv_highgui243d.lib
3개의 라이브러리를 설정한다. 편집탭을 사용하고 한라인에 하나씩 입력한다. 입력 후
opencv_core243d.lib; opencv_imgproc243d.lib; opencv_highgui243d.lib;
형식으로 ";"으로 띄어 쓰기가 되어 있어야 한다.
(6) D:\Opencv\opencv 2.4.6\build\x86\vc11\bin 위치로 가서 3개의 dll파일을 선택한다. 이때 프로젝트가 Debug버전이면 파일이름 뒤에 "d"가 붙은 파일을 선택한다.
opencv_core243d.dll, opencv_imgproc243d.dll, opencv_highgui243d.dll
의 3개의 파일을 선택한다.
이 파일을 작성한 프로젝트의 Debug디렉토리에 복사한다.
이때 주의할 점은 vs2012에서 작성한 프로젝트가 solution(sln)이면 sln의 Debug위치에 복사한다 (이것이 보통의 경우이다).
(7) 설정이 끝났으므로 코드를 하나 작성하고 실행해 본다.
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
void main()
{
Mat image;
image = imread("test.png");
imshow("image",image);
waitKey(0);
}
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
void main()
{
Mat image;
image = imread("test.png");
imshow("image",image);
waitKey(0);
}
피드 구독하기:
글 (Atom)