강의
정적 라이브러리 (static library) 빌드하기
lib의 부재 매번 편하게 lib, dll만을 사용했는지, 일전에 아주 바보같은 일을 겪었다. 최근 필요에 의해 zlib 소스를 사용해야할 일이 생겼는데 난처한 상황이 생겼다. 라이브러리 폴더 등 PATH설정을 마치고 빌드를 실행하니 링커에서 에러가 발생했다. 에러코드 LNK2019가 발생하는 것을 보고 헤더파일의 선언은 더보기…
lib의 부재 매번 편하게 lib, dll만을 사용했는지, 일전에 아주 바보같은 일을 겪었다. 최근 필요에 의해 zlib 소스를 사용해야할 일이 생겼는데 난처한 상황이 생겼다. 라이브러리 폴더 등 PATH설정을 마치고 빌드를 실행하니 링커에서 에러가 발생했다. 에러코드 LNK2019가 발생하는 것을 보고 헤더파일의 선언은 더보기…
얼마 전 카카오톡 개발자 채팅방에서 있었던 일입니다. 이 채팅방 인원들은 참으로 개발자스럽게 개인이 직접 관리하거나 호스팅업체로부터 임대받아 호스팅을 운영하는 사람들이 많이 있습니다. 우연찮게 어떤 분이 본인이 운영하던 서버주소를 공유한 일이 있었는데, 브라우저에 내장된 네트워크 모니터로 프로파일링을 하신분이 계셨어요. AWS에서 임대받았으며, 더보기…
지난 정규식 (Regular Expression) 2) 사용용법 글에 이어
벌써 정규식 강의 연재의 끝을 향하고 있습니다.
마지막인 3번 문제풀이입니다.
이번에 다룰 문제들은 regexone (https://regexone.com/) 페이지에 나와있는 문제들 입니다. 꼭 들어가서 직접 문제풀이에 참여해보세요
본격적으로 문제에 대해 풀이를 하기전 한가지, 이 글에서 regexone의 레슨은 진행하지 않겠습니다. 이전 1편과 2편에서 다루었던 내용들의 반복이기도 하기 때문에 이번 편에서는 얼마나 잘 공부했는지를 테스트 하는 시간이 되도록 할 것입니다.
만약 본인이 문제를 풀다가 막힌다면 답을 보기전에 한 타임 더 생각을 해보는 것이 좋습니다.
정규식에서 절대라는 것은 없습니다. 모든 코드가 그렇듯 한 가지의 주제를 다양하게 표현할 수 있기에 꼭 정답과 일치할 필요도 없으니 일단 한 번 작성해보세요.
그래야 성취감이 늘어납니다 🙂
이제 문제를 풀어볼게요
문제1
다음 보기중 720p를 제외한 나머지 라인만 일치할 수 있는 식을 작성하시오
직전 글 “정규식 (Regular Expression) 1) 기본문법” ( https://myoaftp.duckdns.org/techlog/archives/356 ) 에 이어 문법을 하나씩 풀어 실제로 사용되는 용법에 대해 확인해보도록 하겠습니다. 아래 글은 제가 약 2년전 작성했던 글로 두서없이 나열한 설명이라 조금 부족하지만 레퍼런스로 활용하기 좋을 것 같아 그대로 복사해보았습니다. 한창 더보기…
일전의 링크에서 [정규식 개론] 정규식이 무엇이고, 왜 정규식을 배워야하는지에 간단하게 설명하였습니다. 이번 글에서는 정규식의 표현 방법. 즉, 정규식 문법에 대해 알아보도록 하겠습니다. 다음과 같은 순서로 글을 전개하도록 하겠습니다. 1. 기본문법 2. 상세 풀이 및 용법 1. 기본문법 정규식 문법에는 여러 더보기…
카일 광축(Optical Switch)은 스위치를 눌렀을 때 적외선 센서가 누름을 감지 (점광원으로부터 이동하는 방향에 생긴 장애물) 한다. 따라서 광축 키보드는 기존 클릭, 넌클릭, 리니어 같은 방식으로 동작하는 것이 아니라 정전용량이 없는 무접점 키보드처럼 동작한다고 볼 수 있음. 그렇기 때문에 걸쇠느낌을 인위적으로 더보기…
HTTP/2 통신도 적용할 겸 신 버전과 openssl 1.0.2 를 적용하고자 업데이트를 하려고 한다. HTTP/2에 대한 정보는 아래를 참고하자 http://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-http2/ 위 사진만 봐도 충분히 http/2 프로토콜로 통신할 필요를 느낀다. nginx컴파일 시 주던 arguments /* Nginx -V하면 나오는 더보기…
앞으로 나올 수학적 개념과 연산… 들이 많이 걱정되긴 하지만
결국은 배워야 늘고 해야 느는것이기 때문에 마인드컨트롤하며 무너지지않고 잘 진행할 수 있도록 노력해야겠다.
이번에는 수학적 개념에 앞서 Mat클래스내에서 연산(API의 상위 레벨)하는것을 목표로 한다.
#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했을 때 기존 원본가 같음을 확인할 수 있다.
#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를 이용해 모자이크 효과를 내는것이 목표이다.
TYPE값이 왜 0인가… 설마 CV_8UC1의 상수값이 0이던가~~했는데
역시나. 이왕이면 좀 알아두는게 좋을 것 같아 아래 링크를 참고하였다.
영상처리라 하면 2차원의 Template행렬에 대한 연산과 처리를 의미한다. 영상의 적절한 핸들링과 결과를 위해서 기본클래스들을 익혀왔고, 이제는 GUI관련 처리, 영상 핸들링에 친숙해지는 단계를 거칠 차례이다. 먼저 윈도우 관련 함수. void namedWindow(const string& winname, int flags = 1) void imshow(const string& 더보기…