[Python] type보다 명확한 isinstance

type은 객체가 실질적으로 생성한 클래스의 정보를 보여줍니다. 가장 간단하면서, 확실하게 객체 타입을 알아낼 수 있습니다. 객체 타입 비교또한 >>> int == type(123) True 위처럼 간단하게 끝낼 수 있습니다.   하지만 상속관계가 낀다면 얘기가 달라집니다. 클래스 Foo와 클래스 Bar(Foo)가 존재할 때, >>> b= Bar() >>> type(b) == Bar # b는 Bar를 더보기…

[Python] 테스트 기반 개발 준비하기

본 글은, 이호성님의 slideshare 게시물중 “Python 테스트 시작하기” 프레젠테이션을 참고하여 작성되는 글입니다.   들어가기에 앞서 일전부터 손보고 싶은 부분도 있었고 입맛에 맞도록 youtube-dl 레파지토리를 수정해보려고 계획을 했었습니다. (Media Downloader 업데이트 때문) 근래 시간적 여유가 생겨 기여를 위한 시간 투자를 시작했습니다. 데이터 플로우를 읽으면서 프로젝트 구조를 파악하려고 했는데 생각보다 프로젝트 규모가 더보기…

[python] Numpy Dimension, Axis

도입 Numpy를 사용한지 얼마되지 않았다면 Axis와 Broadcasting 때문에 머리가 아플때가 많다. (필자도 가끔씩 골머리 썩고 있다) 배열 접근이나 연산(dot product, sum 등..) 시에 지금 연산하고자 하는 축이 어디인지.. 자주 하다보면 직감으로 되지만, 그렇지 않다면 예외를 만나기 일쑤다. Axis? Dimension? 삽질해보겠다고, 예제를 만들 때 더욱 헷갈리게 만드는 행동 중 하나가 있다. 더보기…

홈 IoT 제작 – 대중교통편 (3) 구현

(이전글 홈 IoT 제작 – 대중교통편 (2) 설계) 휴가를 다녀오느라 구현과 이후 편들에 대해 작성을 하지 못했다.. 가야할 길이 멀고도 멀어 얼른얼른 진행해야 했다.   구현 버튼 하나로 버스, 지하철 모드를 바꿀 수 있게 설계하였고 각 모드에서 페이지네이션이 필요할 경우 타이머를 통해 페이지를 나타낼 수 있도록 구현하였다. 어느정도 코드가 완성되고나서 타임 더보기…

홈 IoT 제작 – 대중교통편 (2) 설계

설계를 위한 배경 이전 글( 홈 IoT 제작 – 대중교통편 (1) ) 에 이어서 설계 및 구현 내용을 작성해보고자 한다. 설계에 앞서 내가 이용할 외부데이터를 정리해보았다. 버스 도착정보와 지하철 열차 시간표가 필요했다. 버스의 경우 내 거주지역이 경기도이므로 경기버스 (http://gbis.go.kr) 에서 찾아보기로 했다. 테스트용 값이나 테스트를 위한 데이터를 받아오는 것은 가능했지만 더보기…

홈 IoT 제작 – 대중교통편 (1)

홈 IoT제작 7월을 맞아 여유가 생겨 몇 가지 뚝딱뚝딱을 진행하고 있다. 그 중 하나가 홈 IoT 제작인데, 아주 예전에 스마트 미러를 제작하다가 실용성 문제와 개발팀간 일정 조율에 문제가 있어 무산되었었다. 그러다가 최근 알리에서 시킨 온도조절형 인두가 마침 도착하여 큰 프로젝트 말고 작은 프로토타입 몇 개를 합쳐 홈 IoT를 구성해보고자 했다.   더보기…

PCA(고유 성분 분석)를 통한 Eigenface recognizer

PCA를 활용하여 Eigenface vector 계산 그리고 얼굴 인식 영상처리에서 얼굴을 인식하는 방법은 다양하다. 그 기본으로 Eigenface방법이 존재하는데, 영상에서 고유성분을 분석(PCA) 및 추출하여 각각의 고유벡터를 Eigenface(고유 얼굴)로 사용한다.  Eigenface는 PCA의 결과로 가장 큰 고유값의 고유 벡터가 첫번째 데이터 분포축이고 그 다음으로 큰 고유값의 고유벡터는 두 번째 데이터 분포축… 이 된다. 재밌는 더보기…

배열 등에서 인덱스를 잘못 사용했을 때 수정

배열 등에서 인덱스를 잘못 사용했을 때 수정   가끔 개발을 하다보면 배열 첨자를 잘못 사용하는 경우가 있다. 예를 들면 arr[y][x]를 해야하는데 arr[x][y]로 했다던지.. 이 때 코드가 짧으면 수정하기 어렵지 않겠으나 양이 좀 많을 경우 실수가 남아 오히려 아웃오브바운드를 만날 수도 있다.   이럴 경우 정규식을 지원하는 편집기에서 다음과 같이 대치(Replacement)를 더보기…

정적 라이브러리 (static library) 빌드하기

lib의 부재 매번 편하게 lib, dll만을 사용했는지, 일전에 아주 바보같은 일을 겪었다. 최근 필요에 의해 zlib 소스를 사용해야할 일이 생겼는데 난처한 상황이 생겼다. 라이브러리 폴더 등 PATH설정을 마치고 빌드를 실행하니 링커에서 에러가 발생했다. 에러코드 LNK2019가 발생하는 것을 보고 헤더파일의 선언은 인식했으나 정의는 제대로 로드되지 않은 것 같았다. 참 웃기게도 바보처럼 더보기…

[opencv] Mat클래스의 기본연산

앞으로 나올 수학적 개념과 연산… 들이 많이 걱정되긴 하지만

결국은 배워야 늘고 해야 느는것이기 때문에 마인드컨트롤하며 무너지지않고 잘 진행할 수 있도록 노력해야겠다.

 

이번에는 수학적 개념에 앞서 Mat클래스내에서 연산(API의 상위 레벨)하는것을 목표로 한다.

  • flip()
#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define WIN_NAME "winSrcImage"
#define FILE_LENA_JPG "lena.jpg"
int main(void) {

	IplImage* image = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE); // Intel Processing Library
	Mat matrixA1 = cvarrToMat(image);		  // 데이터 공유
	Mat matrixA2 = cvarrToMat(image).clone(); // 데이터까지 복사

	Mat matrixB, matrixC;
	flip(matrixA1, matrixB, 0); // 상하
	imshow("matB", matrixB);
	imshow("origin1", matrixA1);

	flip(matrixA1, matrixC, 1); // 좌우
	imshow("matC", matrixC);
	imshow("origin2", matrixA1);

	// flip을 해도 원본데이터에는 당연히 영향이 가지않음 ->  clone:데이터복사

	waitKey(0);
	destroyAllWindows();

	return 0;
}

flip함수는 이름과 같이 직관적이다.

기억해야할 것은 마지막 flipCode인자에 0을 넣으면 상하(x축을 기준으로), 1을 넣으면 좌우(y축을 기준으로)에 대하여 대칭이 된다.

위에 주석에도 적었듯이 flip을 적용한다고 원본 매트릭스에 영향이 가지는 않는다.

flip을 한 후에 다시 원본데이터를 imshow했을 때 기존 원본가 같음을 확인할 수 있다.

 


 

  • repeat
  • roi
#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define WIN_NAME "winSrcImage"
#define FILE_LENA_JPG "lena.jpg"
int main(void) {

	Mat srcImage = imread("lena.jpg", IMREAD_GRAYSCALE);
	if (srcImage.empty()) {
		return -1;
	}

	Rect rectROI(0, 0, 256, 256);
	Mat extractROI = srcImage(rectROI);
	for (int i = 0; i < 64; i++) {
		for (int j = 0; j < 64; j++) {
			extractROI.at<uchar>(i, j) = 0;
		}
	}
	imshow("ROI", extractROI);
	imshow("src", srcImage);

	waitKey(0);

	Mat repeatedMat = repeat(extractROI, 2, 2);
	imshow("repeatedMat", repeatedMat);
	waitKey(0);

	return 0;
}

 

ROI는 관심영역일 뿐 데이터를 클로닝하여 저장하는 것이 아니다.

ROI를 지정한 Mat객체의 값을 인위적으로 손실시킨 다음 원본 Mat객체를 확인해보자.

위처럼 원본 srcImage 객체의 데이터에 반영된 것을 볼 수 있다.

 

repeat함수는 주어진 Mat객체의 데이터를 바탕으로 n * m형태의 바둑판식 패턴처럼 이어붙여준다.

물론 주어진 Mat객체의 데이터는 우리가 64*64만큼을 손실시켜놨으므로 위와같은 결과가 나오게 된다.

 


 

  • roi
  • 모자이크화

모자이크 함수를 쓰는것은 아니고, ROI를 이용해 모자이크 효과를 내는것이 목표이다.

 

 

 

 

TYPE값이 왜 0인가… 설마 CV_8UC1의 상수값이 0이던가~~했는데

역시나. 이왕이면 좀 알아두는게 좋을 것 같아 아래 링크를 참고하였다.

(더 보기…)