C\#OpenCV 를 호출 하여 간이 판 미 도 도 구 를 개발 합 니 다[추천]
C\#에서 OpenCV 를 호출 하 는 것 은 사실 매우 간단 하 다.왜냐하면 C\#에는 OPENCV 의 오픈 소스 라 이브 러 리 가 많 기 때문이다.
본 고 는 주로 WPF 프로젝트 에서
OpenCVSharp3-AnyCPU
소스 라 이브 러 리 처리 그림 을 사용 하 는 것 을 소개 한다.다음은 우리 가 먼저 개발 전의 준 비 를 한다.준비 작업
우선 WPF 프로젝트 를 만 듭 니 다.
그리고 Nuget 에서 OpenCVsharp 를 검색 하면 다음 과 같 습 니 다.
이 어 OpenCVsharp 3-AnyCPU 옵션 을 선택 하여 설치 합 니 다.
OpenCVsharp 3-AnyCPU 를 설치 하면 우리 프로젝트 는 자동 으로 4 개의 라 이브 러 리 를 도입 합 니 다.다음 그림:
여기까지 우리 의 준비 작업 이 완성 되 었 으 니 매우 간단 하 다.
C\#에 OPENCV 적용
지금 우 리 는 프로젝트 에 들 어가 서 OPENCV 호출 을 진행 합 니 다.
우 리 는 먼저 OpenCV 와 관련 된 네 임 스페이스 를 도입 합 니 다.다음 과 같 습 니 다.
using OpenCvSharp;
using OpenCvSharp.Extensions;
그리고 우 리 는 프로젝트 에서 Mat 류 를 사용 하여 그림 작업 을 한다.빨간색 과 파란색 채널 교환
OPenCV 에 서 는 Mat 류 가 매우 중요 하 며 그림 을 처리 하 는 입구 입 니 다.
지금,우 리 는 먼저 간단 한 그림 조작 을 합 니 다.빨간색 과 파란색 채널 의 색상 교환,코드 는 다음 과 같 습 니 다.
Mat mat = new Mat(@"..\..\Images\ocv02.jpg", ImreadModes.Unchanged);
for (var y = 0; y < mat.Height; y++)
{
for (var x = 0; x < mat.Width; x++)
{
Vec3b color = mat.Get<Vec3b>(y, x);
var temp = color.Item0;
color.Item0 = color.Item2; //B R
color.Item2 = temp; //R B
mat.Set(y, x, color);
}
}
var mem = mat.ToMemoryStream();
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = mem;
bmp.EndInit();
imgOutput.Source = bmp;
mat.Dispose();/// mat , ,
효과 도 는 다음 과 같다.그림 의 빨간색 과 파란색 채널 의 색상 교환 을 성공 적 으로 처리 한 것 을 볼 수 있다.
지금 우 리 는 OpenCV 의 조작 을 좀 더 한다.
부식
코드 는 다음 과 같 습 니 다:
using (var src = new Mat(@"..\..\Images\ocv02.jpg", ImreadModes.AnyDepth | ImreadModes.AnyColor))
{
Cv2.Erode(src, src, new Mat());
var mem = src.ToMemoryStream();
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = mem;
bmp.EndInit();
imgOutput.Source = bmp;
}
효과 도 는 다음 과 같다.반전
코드 는 다음 과 같 습 니 다:
using (var src = new Mat(@"..\..\Images\ocv02.jpg", ImreadModes.AnyDepth | ImreadModes.AnyColor))
{
using (var dst = new Mat())//
{
Cv2.BitwiseNot(src, dst, new Mat());
var mem = dst.ToMemoryStream();
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = mem;
bmp.EndInit();
imgOutput.Source = bmp;
}
}
효과 도 는 다음 과 같다.밝기―어 두 워 지다
코드 는 다음 과 같 습 니 다:
BitmapImage bmpSource = new BitmapImage(new Uri("pack://application:,,,/images/ocv02.jpg" ));
Mat mat = bmpSource.ToMat();
for (var y = 0; y < mat.Height; y++)
{
for (var x = 0; x < mat.Width; x++)
{
Vec3b color = mat.Get<Vec3b>(y, x);
int item0 = color.Item0;
int item1 = color.Item1;
int item2 = color.Item2;
#region
item0 -= 60;
item1 -= 60;
item2 -= 60;
if (item0 < 0)
item0 = 0;
if (item1 < 0)
item1 = 0;
if (item2 < 0)
item2 = 0;
#endregion
#region
//item0 += 80;
//item1 += 80;
//item2 += 80;
//if (item0 > 255)
// item0 = 255;
//if (item1 > 255)
// item1 = 255;
//if (item2 > 255)
// item2 = 255;
#endregion
color.Item0 = (byte)item0;
color.Item1 = (byte)item1;
color.Item2 = (byte)item2;
mat.Set(y, x, color);
}
}
var mem = mat.ToMemoryStream();
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = mem;
bmp.EndInit();
imgOutput.Source = bmp;
mat.Dispose();/// mat , ,
보시 다시 피 이곳 의 코드 는 약간 특별 합 니 다.우 리 는 BitmapImage 를 통 해 그림 을 가 져 온 후 BitmapImage 의 대상 을 직접 사용 하 는 ToMat 방법 으로 BitmapImage 를 Mat 클래스 의 대상 으로 변환 합 니 다.
이 ToMat 방법 은 BitmapImage 류 의 방법 이 아니 라 확장 방법 이기 때문에 OpenCvsharp 네 임 스페이스 를 참조 해 야 BitmapImage 와 Bitmap 대상 이 확장 방법 ToMat 를 추가 할 수 있 습 니 다.
효과 도 는 다음 과 같다.
정점 변화
코드 는 다음 과 같 습 니 다:
using (var src = new Mat(@"..\..\Images\ocv02.jpg", ImreadModes.AnyDepth | ImreadModes.AnyColor))
{
using (var dst = new Mat())//
{
//
List< Point2f> AffinePoints0 =new List<Point2f>() { new Point2f(100, 50), new Point2f(100, 390), new Point2f(600, 50) };
//
List<Point2f> AffinePoints1 = new List<Point2f>() { new Point2f(200, 100), new Point2f(200, 330), new Point2f(500, 50) };
//
Mat Trans =Cv2.GetAffineTransform(AffinePoints0, AffinePoints1);
//
Cv2.WarpAffine(src, dst, Trans,new OpenCvSharp.Size() { Height= src.Cols, Width= src.Rows });
var mem = dst.ToMemoryStream();
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = mem;
bmp.EndInit();
imgOutput.Source = bmp;
}
}
효과 도 는 다음 과 같다.미모 마찰 쌍무 필터
코드 는 다음 과 같 습 니 다:
using (var src = new Mat(@"..\..\Images\ocv02.jpg", ImreadModes.AnyDepth | ImreadModes.AnyColor))
{
using (var dst = new Mat())//
{
Cv2.BilateralFilter(src, dst, 15, 35d, 35d);
var mem = dst.ToMemoryStream();
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = mem;
bmp.EndInit();
imgOutput.Source = bmp;
}
}
효과 도 는 다음 과 같다.이 를 통 해 알 수 있 듯 이 사진 에는 OpenCV 의 필터 처리 가 많 지만,글 에는 몇 가지 만 소 개 돼 있다.이 는 다른 처리 와 글 의 필터 처리 방법 이 대동소이 하기 때문에 이 몇 가지 만 열거 한 것 이다.
관심 있 는 친 구 는 스스로 코드 를 다운로드 하여 공부 할 수 있다.
여기 서 C\#OpenCV 를 호출 하여 간이 판 미 도 도 구 를 개발 하면 끝 납 니 다.
코드 가 Github 에 전송 되 었 습 니 다.다운로드 환영 합 니 다.
Github 주소:https://github.com/kiba518/WpfOpenCV
총결산
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 C\#OpenCV 를 호출 하여 간이 판 미 도 도 도 구 를 개발 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.