기본 Control로 Flat Style UI
이제 나이 먹어 강제로 4.0 버전업됨, 일인개발자임, 파키스탄식 코딩.. 오래된 코드도 다시 쓴다.
기본 Control로 Flat Style UI
MySQL, Maria DB에 저장된 내용을 최소 두글자로 검색하고 싶으면, 다음과 같은 셋팅이 필요하다.
우선 설정 파일을 찾아야 하는데 윈도우의 경우
MySQL => C:\ProgramData\MySQL\MySQL Server 5.6\My.ini
Maria DB => C:\Program Files\MariaDB 10.0\data\My.ini
파일을 열고
[mysqld] 항목 아래에 다음과 같이 기입한다.
추가 > 데이터 전송량을 늘리고 싶다면, [mysqld] 항목 아래에 다음과 같이 기입한다.
패킷을 1G로 설정하고 싶다면..
max_allowed_packet=1024M
Maria DB의 my.ini 파일 편집화면
참조 문서 : MSDN Task Parallelism (Task Parallel Library)
함께 읽어보면 도움 되는 자료 링크 : http://blog.powerumc.kr/175?category=206843
개인적으로 멀티 작업 처리를 할 때 자주 쓰는 패턴이다.
모든 상황에 병렬처리가 꼭 좋은 성능을 발휘하는건 아니므로 상황에 따라 적절히 사용하는게 좋다.
using System.Threading.Tasks; using System.Collections.Concurrent; Object _lockObject = new Object(); // READ OR WRITE DATA List<object> _testObject = new List<object>(); ..... // PATTERN Task task = Task.Factory.StartNew(() => { int maxWorkingCount = _testObject.Count; int workingRangeSize = 1; int processedCount = 0; // 논리 프로세스 수량 만큼 쓰레드 생성 if (maxWorkingCount > Environment.ProcessorCount) { workingRangeSize = maxWorkingCount / Environment.ProcessorCount; } var part = Partitioner.Create(0, maxWorkingCount, workingRangeSize); Parallel.ForEach(part, (num, state) => { for (int i = num.Item1; i < num.Item2; i++) { // 처리하고자 하는 데이터 읽기 object currentData = _testObject[i]; // 현재 처리 수량 processedCount++; // 만약 처리 데이터를 한곳에 모으고 싶다면 lock을 사용 lock(_lockObject) { // 예제 object processedObject = Process(currentData); _testObject.Add(processedObject); } }// END FOR }); }); // 이 부분은 필요에 따라 작성하던.. 안하던.. try { // 처리가 완료 될때 까지 대기 task.Wait(); // 후 처리 영역 } catch (AggregateException ex) { // 쓰레드 영역 예외 } catch(Exception ex) { // 후 처리 예외 } .....
적용 이미지 예시 ( OpenCV 공식 홈페이지 )
이미지 선 성분 검출을 위해서 서전에 이 작업을 거치면 비교적 원하는 결과를 얻을 수 있다.
OpenCVSharp ver 3.2에서는 Kmeans Method를 지원한다.
이 Method의 Parameter의 의미는 여기에서 참조 하길 바란다.
아래는 C#으로 구현된 OpenCVSharp을 활용한 K-means
public static void Kmeans(Mat input, Mat result, int k) { using (Mat points = new Mat()) { using (Mat labels = new Mat()) { using (Mat centers = new Mat()) { int width = input.Cols; int height = input.Rows; points.Create(width * height, 1, MatType.CV_32FC3); centers.Create(k, 1, points.Type()); result.Create(height, width, input.Type()); int i = 0; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++, i++) { Vec3f vec3f = new Vec3f { Item0 = input.At<Vec3b>(y, x).Item0, Item1 = input.At<Vec3b>(y, x).Item1, Item2 = input.At<Vec3b>(y, x).Item2 }; points.Set<Vec3f>(i, vec3f); } } Cv2.Kmeans(points, k, labels, new TermCriteria(CriteriaType.Eps | CriteriaType.MaxIter, 10, 1.0), 3, KMeansFlags.PpCenters, centers); i = 0; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++, i++) { int idx = labels.Get<int>(i); Vec3b vec3b = new Vec3b(); int tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item0)); tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp; vec3b.Item0 = Convert.ToByte(tmp); tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item1)); tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp; vec3b.Item1 = Convert.ToByte(tmp); tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item2)); tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp; vec3b.Item2 = Convert.ToByte(tmp); result.Set<Vec3b>(y, x, vec3b); } } } } } }
using OpenCvSharp /* Mat => System.Drawing.Bitmap */ Bitmap bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); /* System.Drawing.Bitmap => Mat */ Mat mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap); /* Mat => byte[] */ // TYPE 1 byte[] imageBytes = mat.ToBytes(".jpg"); // TYPE 2 byte[] imageBytes; Cv2.ImEncode(".jpg", mat, out imageBytes); /* byte[] => Mat */ // TYPE 1 : COLOR Mat colorMat = Mat.FromImageData(imageBytes, LoadMode.Color); // TYPE 2 : GRAY Mat grayMat = Mat.FromImageData(imageBytes, LoadMode.GrayScale); // TYPE 3 Mat grayMat = Cv2.ImDecode(imageBytes, LoadMode.GrayScale);
어떠한 기능을 하는 콘솔프로그램에 인수를 받아 처리 하는 프로그램이라면, 인수의 길이가 길어질 가능성이 있는지 고려해야한다.
다음은 Microsoft 문서 중 일부
인수가 길어질 가능성이 있다면, 인수를 파일로 만들어 처리하자.
C#에서 OpenCV를 사용하고자 할 때, Visual Studio가 설치 되어 있다면
도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔 을 실행한다.
패키지 관리자 콘솔창에서 다음과 같이 입력
그러면 자동으로 설치가 되고, 관련 DLL 파일은 솔루션 디렉토리 내에 packages 폴더에 존재한다.
간단한 예제
만약, 실행 중 오류가 난다면 OpenCV 홈페이지에서 (http://opencv.org/releases.html) WinPack 파일을 다운 받은 후, 압축 해제하고
버전 마다 틀리겠지만 3.2버전 기준으로 opencv\build\x64\vc14\bin 디렉토리에 있는 파일 전체를 복사하여, 현재 개발중인 프로젝트의 Debug폴더에 복사&붙여넣기한 후 실행하면 해결된다.
3월 말부터 직구부터 해서 하나씩 부품 사모아 드뎌 오늘에서야 시스템을 완성
RGB 컨셉 PC, 용도는 영상 제어 실험, 멀티 OS 제어 (벨런스시스템) 연구 외 개인용도로 구축.
시스템 전체 화면
WebClient Class든 HttpWebRequest Class든, 간혹 같은 코드로 Web에서 데이터 수신이 잘 되던게
갑자기 안될 경우가 있다.
Exception 메시지는 “기본 연결이 닫혀 있습니다.”
Google검색으로 여러가지 해결법이 있지만, 되는것도 있고 서버에서 설정 변경으로 처리해야만 가능 할 경우가 있다.
아래 코드는 위의 에러가 생길 경우, 서버 설정변경이 어려운 상황이나 같은 URL로 브라우저에서 호출하면 이상은 없는데
유독 위 Class로 자동화 구현시 Exception 걸릴 경우, 꼼수?로 좋은 코드다.
명령어 : mysqldump –u [user name] –p[password] [database name] > [dump file]
일자별로 자동백업 할 경우,
아래와 같이 배치 파일 생성
mysqldump -u root -ppassword databse > C:\backupdb\%date:-=%.sql
그리고 스케쥴러 등록 후 사용