posted by 심재형 2017. 11. 11. 00:25

#include "opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
 uchar dataA[] = {   1, 2, 4, 5, 2, 1,
      3, 6, 6, 9, 0, 3,
      1, 8, 3, 7, 2, 5,
      2, 9, 8, 9, 9, 1,
      3, 9, 8, 8, 7, 2,
      4, 9, 9, 9, 9, 3 };
 Mat A(6, 6, CV_8U, dataA);
 cout << "A = " << A << endl;

 int ksize = 3;
 // double sigma = 0.3*((ksize-1)*0.5-1)+0.8; // when ksize >=9 
 double sigma = 0.0;
 Mat kx = getGaussianKernel(ksize, sigma);
 cout << "kx = " << kx << endl;

 Mat ky = getGaussianKernel(ksize, sigma);
 cout << "ky = " << ky << endl;

 Mat kxy = ky*kx.t();
 cout << "kxy = " << kxy << endl;
 cout << "sum(kxy)=" << sum(kxy) << endl;

 Mat dst1;
 sepFilter2D(A, dst1, -1, kx, ky);
 cout << "dst1 = " << dst1 << endl;

 Mat dst2;
 filter2D(A, dst2, -1, kxy);
 cout << "dst2 = " << dst2 << endl;

 Mat dst3;
 GaussianBlur(A, dst3, Size(ksize, ksize), 0.0, 0.0);
 cout << "dst3 = " << dst3 << endl;

 waitKey();
 return 0;
}

 

'OpenCV' 카테고리의 다른 글

윤곽선 정보 찾기 - findContours  (0) 2017.11.15
ROI설정  (0) 2017.11.11
merge, split 함수  (0) 2017.11.11
inrange 이진화 영상  (0) 2017.11.11
Template Matching 이용해 모양찾기  (0) 2017.11.04
posted by 심재형 2017. 11. 11. 00:24

#include "opencv.hpp"

using namespace cv;

using namespace std;

int main()

{

Mat srcImage = imread("lena.jpg"); // BGR-Color

if (srcImage.empty())

return -1;


vector<Mat> planes;

split(srcImage, planes);


// imshow("srcImage", srcImage);

imshow("planes[0]", planes[0]); //Blue

imshow("planes[1]", planes[1]); //Green

imshow("planes[2]", planes[2]); //Red


// planes[0] = 0;

// Mat dstImage(srcImage.rows, srcImage.cols, srcImage.type());

Mat dstImage;

merge(planes, dstImage);

imshow("dstImage", dstImage);

waitKey();

return 0;

}

'OpenCV' 카테고리의 다른 글

ROI설정  (0) 2017.11.11
블러함수들  (0) 2017.11.11
inrange 이진화 영상  (0) 2017.11.11
Template Matching 이용해 모양찾기  (0) 2017.11.04
OpenCV 이미지 크기 조정하기  (0) 2017.11.04
posted by 심재형 2017. 11. 11. 00:21

#include "opencv.hpp"

using namespace cv;

using namespace std;

int main()

{

Mat rgbImage = imread("hand.jpg");

// Mat rgbImage = imread("flower.jpg");


imshow("rgbImage", rgbImage);


Mat hsvImage;

cvtColor(rgbImage, hsvImage, COLOR_BGR2HSV);

imshow("hsvImage", hsvImage);


// hand.jpg

Scalar lowerb(0, 40, 0);

Scalar upperb(20, 180, 255);


// flower.jpg

// Scalar lowerb(150, 100,  100);

// Scalar upperb(180, 255, 255);


Mat dstImage;

inRange(hsvImage, lowerb, upperb, dstImage);

imshow("dstImage1", dstImage);


// check HSV range in object hand

vector<Mat> planes;

split(hsvImage, planes);

// imshow("planes[0]", planes[0]);

// imshow("planes[1]", planes[1]);

// imshow("planes[2]", planes[2]);


double minH, maxH;

minMaxLoc(planes[0], &minH, &maxH, NULL, NULL, dstImage);

cout << "minH =" << minH << ", maxH =" << maxH << endl;


double minS, maxS;

minMaxLoc(planes[1], &minS, &maxS, NULL, NULL, dstImage);

cout << "minS =" << minS << ", maxS =" << maxS << endl;


double minV, maxV;

minMaxLoc(planes[2], &minV, &maxV, NULL, NULL, dstImage);

cout << "minV =" << minV << ", maxV =" << maxV << endl;


waitKey();

return 0;

}

'OpenCV' 카테고리의 다른 글

블러함수들  (0) 2017.11.11
merge, split 함수  (0) 2017.11.11
Template Matching 이용해 모양찾기  (0) 2017.11.04
OpenCV 이미지 크기 조정하기  (0) 2017.11.04
OpenCV Assertion failed (size.width>0 && size.height>0) Error  (0) 2017.11.04
posted by 심재형 2017. 11. 4. 14:07

OpenCV에서는 MatchTemplate함수를 이용해 특정 모양을 찾을 수 있다. 템플릿 매칭은 참조영상에서 템플릿영상과 매칭되는 위치를 탐색하는 방법이다. 템플릿 매칭은 물체 인식, 스테레오 영상에서 대응점 검출 등에 사용될 수 있다. 일반적으로 이동(translation)문제는 해결할 수 있으나, 회전 및 스케일링된 물체를 매칭하는 것은 어려운 문제이다. 템플릿 매칭에서 영상의 밝기를 그대로 사용할 수도 있고, 에지, 코너점, 주파수 변환 등의 특징 공간으로 변환하여 템플릿 매칭을 수행할 수 있으며, 영상의 밝기 등에 덜 민감하도록 정규화 과정이 필요하다. 매칭 방법은 상관관계(correlation),SAD(Sum of absolute differences)등을 사용한다. 


 void match Template(InputArray image, InputArray templ, OutputArray result, int method)  


참조 영상 이미지에서 templ을 method의 유형에 따라 템플릿 매칭을 계산해 result에 반환한다. image는 8비트 또는 32비트 실수이며, templ은 image에서 찾으려는 작은 영역의 템플릿으로, 자료형은 image와 같고, 크기는 image와 같거나 작아야한다. result는 결과를 저장하는 32비트 실수 행렬로, image크기가 W*H, templ의 크기가 w*h이면 result의 크기는 (W-w+1)*(H-h+1)이다. method는 비교하는 방법을 지정한다. 최종적으로 템플릿 매칭위치를 찾기 위해서는 minMaxLoc 함수를 사용하여, matchTemplate함수의 결과인 result에서 method에 따라서 최소값(TM_SQDIFF)의 위치 또는 최대값(TM_CCORR, TM_CCOEFF)의 위치를 찾아 템플릿 매칭위치를 찾는다. 주의할 것은 minMaxLoc함수는 같은 값의 최대값, 최소값이 있을 경우 처음 위치만 찾는다. matchTemplate함수는 컬러 영상에 대해서도 처리하며, 컬러 영상의 결과 행렬인 result는 1-채널 행렬이다. 템플릿 영상의 크기가 큰 경우에는 계산 속도가 느릴 수 있다. 이때에 주파수 영역의 위상 상관관계에 의한 매칭을 하면 계산 속도를 높일 수 있다. 


1)method=TM_SQDIFF 

템플릿 T를 탐색영역 I에서 이동시켜가며 차이의 제곱의 합계를 계산한다. 매칭되는 위치에서 작은 값을 가진다. 


2)method=TM_SQDIFF_NORMED 

R_SQDIFF(x,y)를 D(x,y)로 나누어 정규화 한다. 


3)method=TM_CCORR 

템플릿 T를 탐색영역 I에서 이동시켜가며 곱의 합계를 계산한다. 매칭되는 위치에서 큰 값을 가진다. 


4)method=TM_CCORR_NORMED 

R_CCORR(x,y)를 D(x,y)로 나누어 정규화한다. 


5)method=TM_CCOEFF

T'는 템플릿 T의 각 요소값에서 평균을 뺄셈한 변환 템플릿이며, I'는 템플릿과 대응되는 위치에서 I의 각 요소값에서 평균을 뺄셈한 영상이다. 즉, 각 평균값으로 보정하여 비교한다. 매칭되는 위치에서 큰 값을 가진다. 


6)method=TM_CCOEFF_NORMED 

R_CCOEFF(x,y)를 D(x,y)로 나눠 정규화한다.


<코드>     

결과는 다음과 같다.  





이것을 자율주행차의 영상인식에서 특정 패턴을 찾는 데 응용하면 아래 처럼 사용할 수도 있다. <사진>


HSV로 변환한 이미지에서 노란색만 이진화하였고,

4개의 패턴을 저장하고 매칭하였다.

찾은 패턴은 DetectedStopLine화면에 네모로 표시하도록 하였다.


<코드>



'OpenCV' 카테고리의 다른 글

merge, split 함수  (0) 2017.11.11
inrange 이진화 영상  (0) 2017.11.11
OpenCV 이미지 크기 조정하기  (0) 2017.11.04
OpenCV Assertion failed (size.width>0 && size.height>0) Error  (0) 2017.11.04
OpenCV 실행시 꺼지는 문제  (0) 2017.11.04
posted by 심재형 2017. 11. 4. 10:59
OpenCV에서는 resize 함수를 이용해 이미지 사이즈를 조정할 수 있다.

'OpenCV' 카테고리의 다른 글

inrange 이진화 영상  (0) 2017.11.11
Template Matching 이용해 모양찾기  (0) 2017.11.04
OpenCV Assertion failed (size.width>0 && size.height>0) Error  (0) 2017.11.04
OpenCV 실행시 꺼지는 문제  (0) 2017.11.04
영상 입출력  (0) 2017.11.04
posted by 심재형 2017. 11. 4. 02:40

OpenCV 사용시,

Assertion failed (size.width>0 && size.height>0) in imshow, file /home/yeogsam/opencv-2.4.9/modules/highgui/src/window.cpp, line 269

terminate called after throwing an instance of 'cv::Exception'

  what():  /home/yeogsam/opencv-2.4.9/modules/highgui/src/window.cpp:269: error: (-215) size.width>0 && size.height>0 in function imshow


이런 오류가 발생할 때가 있다. 읽어오는 파일의 경로가 잘못된 경우이므로 파일 위치 다시 확인하여 수정한다.

'OpenCV' 카테고리의 다른 글

Template Matching 이용해 모양찾기  (0) 2017.11.04
OpenCV 이미지 크기 조정하기  (0) 2017.11.04
OpenCV 실행시 꺼지는 문제  (0) 2017.11.04
영상 입출력  (0) 2017.11.04
화소 접근  (0) 2017.11.04
posted by 심재형 2017. 11. 4. 02:38

OpenCV 사용시 화면이 자꾸 꺼지는 문제는 보통 대기 설정을 안해서 발생한다.

main() 닫기 전에 waitKey(); 를 넣으면 명령처리 후 대기하여 결과를 볼 수 있다.

'OpenCV' 카테고리의 다른 글

OpenCV 이미지 크기 조정하기  (0) 2017.11.04
OpenCV Assertion failed (size.width>0 && size.height>0) Error  (0) 2017.11.04
영상 입출력  (0) 2017.11.04
화소 접근  (0) 2017.11.04
자율주행차 신호등 인식  (1) 2017.11.03
posted by 심재형 2017. 11. 4. 02:32
영상파일 읽기 
Mat imread(const string& filename, int flags = 1) imread함수는 파일로부터 flags에 지정된 컬러로 영상을 읽어 Mat행렬로 반환한다.  
flags=2인 경우 입력영상의 깊이에 따라 16비트 또는 32비트 영상을 반한한다. 설정되지 않은 경우 깊이를 8비트로 반환한다. 
flags = IMREAD_COLOR=1로 설정되면, 영상을 항상 컬러 영상으로 변환하여 읽는다. 
flags = IMREAD_GRAYSCLAE=0 으로 설정되면, 영상을 항상 그레이스케일로 변환하여 읽는다. flags>0이면 3-채널 컬러 영상으로 반환하고, flags=0이면 1-채널 그레이스케일 영상으로 반환하며, flags<0이면 Alpha채널 포함하여 영상의 상태 그대로 읽는다. 

 영상파일 쓰기 
bool imwrite(const string& filename, InputArray img, const vector<int>& params = vector<int>()) 
imwrite 함수는 영상 img를 filename에 명시된 파일로 출력한다. 정수 벡터 params는 압축 양식에 사용되는 인수로 (paramId, paramValue)의 쌍으로 명시한다. 
JPEG영상은 paramid=IMWRITE_JPEG_QUALITY에 대해, 값은 [0~100]범위로 높을 수록 영상의 질이 좋다. 
PNG 영상은 IMWRITE_PNG_COMPRESSION를 이용.
   

<결과>



posted by 심재형 2017. 11. 4. 01:17
OpenCv에서 영상은 근본적으로 수치값의 행렬이다. cv::Mat 데이터 구조체를 사용해 행렬을 다룬다. 행렬의 각 원소는 화소 하나를 나타낸다. 그레이레벨 영상(흑백)의 화소는 부호없는 8비트값이다(unsigned char) 검은색에 대응하는 0부터 흰색255까지 있다. 컬러영상의 경우, 색상을 재현하려면 세가지 원색이 필요하다. 인간의 시각 시스템을 통해 받아들이는 색의 정보는 삼원색 형태 이기 때문이다. 기본적으로 컬러 채널은 빨강,초록,파랑이다. <화소 값에 접근> 각 원소는 행렬의 행과 열 번호를 지정해 접근할 수 있다. 보통 반환되는 원소는 단일 수치값이지만, 다중채널 영상인 경우 값이 벡터일 수도 있다.  



at메소드를 호출할 때는 영상의 원소 타입을 지정해야한다. Mat클래스는 세가지 8비트 값의 벡터를 반환한다. Vec3b는 부호가 없는 uchar타입 벡터이다. 이 벡터를 이용해 컬러정보를 얻을 수 있다. Img.at[channel]=value; channel은 세가지 컬러 채널 중 하나를 지정한다. OpenCV내에서는 파랑,초록,빨강 순으로 저장한다. RGB가 아니라 BGR순서이다. 컬러영상은 3채널 화소로 구성된다. 각 채널 화소는 빨강,초록,파랑 중 하나의 명암 값에 대응한다. 각 화소 값은 8비트 부호없는 문자이고, 컬러의 총 개수는 256*256*256으로 1600만 컬러 이상이다. 따라서 복잡도를 줄이려면 영상 내 컬러의 개수를 줄이는 것이 좋다.



posted by 심재형 2017. 11. 3. 19:10
OpenCV를 이용해 자율주행차에서 신호등을 인식할 수 있도록 코딩해봤다.
빨간색, 노란색 -> 정지
초록색 화살표 -> 좌회전
초록색 원 -> 우회전

결과는 다음과 같다.
영상정보 확인을 위해 Row,Columns,Dims,Total,Depth,Channel,Type,Size도 출력했다.





모두 제대로 인식된다.



<작성코드>