Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 커피#그라인더#통돌이 오픈 #로스팅#드립커피#생두#원두
- PDF#챗봇검색#서비스#GPT4#PGT3.5#GPT#랭체인#챗봇#CHATBOT#LLM#문서검색
- mediasaop#webrtc#미디어서버#
- 마이봇#아이폰#아이폰심사#IT고시#
- 플러터#sms#mms#문자보내기
- 임대사업자#리걸테크#legaltech#마이봇#챗봇#법률챗봇#임대사업자챗봇#chatgpt#
- 로우코드#lowcode#erp#관리시스템#시트메이트#시트메타#엑셀업로드#엑셀다운로드#그리드#데이터관리#생산관리시스템#로그관리#히스토리#입력체크
- PDF검색#PDF검색챗봇#NEXTJS#스터디#스타트업#랭체이#langchain#prisma#sqlite#
- 마이봇#chatgpt#ai#인공지능
- flutter#sqlite#chatGPT#
- 광동온더그린#프랜즈#가상CC#스크린골프#
- fcm#메세지전송#안드로이드메세지#플러터메세지전송
- 쇼핑몰관리시스템#매입관리#시트메타#매입채널#엑셀업로드
- 플러터#
- firebase#message#메세지#플러터#안드로이드
- flutter#채팅창@메모창#url링크#날짜추가
- ax5#tree#grid#단계별 펼치기# depth #시트메타
- 마이봇#문서챗봇#PDF#TEXT#유투브#챗봇만들기#랭체인# langchain#벡터데이터#자료검색#챗GPT#GPT4#챗지피티
- 마이봇#챗봇
- 시트메타#관리시스템#테이블연동#품목관리
- 로우코드#ERP#관리시스템#상품관리#선택박스#자동화프로그램
- figma#flutter#dhwise#피그마#플러터#피그마 to 플러터 #figma to flutter
- postgres#vector
- 마이봇#핸드폰대체#
- flutterfire configure#파이어베이스#플러터
- 펫버틀러#서버연동#프로필등록#로그인서버연동#이미지#동영상#업로드용 화면#앱개발#플러터#반려생활#로딩바#loading bar#
- 마이봇#pdf챗봇#상담챗봇#faq챗봇#chatgpt#랭체인#llm
- #창작#SNS#스포츠#반려동물#연애#과제#레시피#활동#건강#운세#글쓰기#비즈니스 #AI비서#챗GPT#CHATGPT
- flutter#ios#앱개발#마이봇#
- 마이봇#API 설정
Archives
- Today
- Total
혼자서 앱 만드는 개발자 함께하는 AI 세상
플러터 카메라 실시간데이터 처리를 위한 startImageStream 본문
반응형
이미지 학습된 데이터를 이용해서 플러터 앱을 통해 실시간 이미지를 분리하는 작업을 하려면 카메라컨트럴러의 startimageStream 을 이용한다.
기존에 구글링소스를 적용하다 최신 dart(3.0.6) flutter(3.10.6) 버전이랑 맞지 않아서 찾아서 수정하는데 어려움이 있어서 다시 작성해서 올려본다.
카메라컨트럴러 선언
컨트럴러 작동 매핑
아래코드를 통해 실시간으로 이미지가 처리되는것을 알수있다.
void _processImageFromStream(CameraImage image) {
print(image.planes[0].bytes[0]);
_savedImage = image;
}
실시간 카메라가 돌아가는 중간 클릭해서 카메라 이미지를 png이미지로 변환 한다.
FloatingActionButton(
onPressed: () {
convertImageToPng(_savedImage);
},
tooltip: 'Increment',
child: Icon(Icons.camera_alt),
),
bgra 포멧과 yuv 포멧에 따라 (저의폰의 경우 yuv포멧)
Future<Uint8List?> convertImageToPng(CameraImage image) async {
Uint8List? bytes;
controller.stopImageStream();
try {
imglib.Image img;
if (image.format.group == ImageFormatGroup.bgra8888) {
img = _convertBGRA8888(image);
imglib.PngEncoder pngEncoder = new imglib.PngEncoder();
bytes = pngEncoder.encode(img);
} else {
bytes = await convertYUV420toImageColor(image);
print(bytes);
_image = bytes!;
}
print(bytes);
return bytes;
} catch (e) {
print(">>>>>>>>>>>> ERROR:" + e.toString());
}
return null;
}
아래 각각 소스로변형시켤수 있다.
imglib.Image _convertBGRA8888(CameraImage image) {
return imglib.Image.fromBytes(
width: image.width,
height: image.height,
bytes: image.planes[0].bytes.buffer,
order: imglib.ChannelOrder.bgra);
}
Future<Uint8List> convertImageToJPG(CameraImage image) async {
YuvChannelling _yuvChannelling = YuvChannelling();
Uint8List imgJpeg = await _yuvChannelling.yuv_transform(image);
return imgJpeg;
}
static const shift = (0xFF << 24);
Future<Uint8List?> convertYUV420toImageColor(CameraImage image) async {
try {
final int width = image.width;
final int height = image.height;
final int uvRowStride = image.planes[1].bytesPerRow;
final int? uvPixelStride = image.planes[1].bytesPerPixel;
print("uvRowStride: " + uvRowStride.toString());
print("uvPixelStride: " + uvPixelStride.toString());
// imgLib -> Image package from https://pub.dartlang.org/packages/image
var img =
imglib.Image(width: width, height: height); // Create Image buffer
// Fill image buffer with plane[0] from YUV420_888
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
final int uvIndex =
uvPixelStride! * (x / 2).floor() + uvRowStride * (y / 2).floor();
final int index = y * width + x;
final yp = image.planes[0].bytes[index];
final up = image.planes[1].bytes[uvIndex];
final vp = image.planes[2].bytes[uvIndex];
// Calculate pixel color
int r = (yp + vp * 1436 / 1024 - 179).round().clamp(0, 255);
int g = (yp - up * 46549 / 131072 + 44 - vp * 93604 / 131072 + 91)
.round()
.clamp(0, 255);
int b = (yp + up * 1814 / 1024 - 227).round().clamp(0, 255);
// color: 0x FF FF FF FF
// A B G R
//img.data[index] = shift | (b << 16) | (g << 8) | r;
if (img.isBoundsSafe(height - y, x)) {
img.setPixelRgba(height - y, x, r, g, b, shift);
}
}
}
var pngEncoder = imglib.PngEncoder(level: 0);
var png = pngEncoder.encode(img);
// muteYUVProcessing = false;
//return Image.memory(png);
return png;
} catch (e) {
print(">>>>>>>>>>>> ERROR:" + e.toString());
}
return null;
}
imglib.Image _convertYUV420(CameraImage image) {
var img = imglib.Image(
width: image.width, height: image.height); // Create Image buffer
Plane plane = image.planes[0];
const int shift = (0xFF << 24);
// Fill image buffer with plane[0] from YUV420_888
for (int x = 0; x < image.width; x++) {
for (int planeOffset = 0;
planeOffset < image.height * image.width;
planeOffset += image.width) {
final pixelColor = plane.bytes[planeOffset + x];
// color: 0x FF FF FF FF
// A B G R
// Calculate pixel color
var newVal =
shift | (pixelColor << 16) | (pixelColor << 8) | pixelColor;
//img.data?[planeOffset + x] = newVal;
}
}
return img;
}
728x90
반응형
'딥러닝 머신러닝' 카테고리의 다른 글
스테이블 디퓨전 파이프 라인 통해 파이썬 으로 웹구축 (0) | 2023.07.23 |
---|---|
Yolov8 을 이용한 커스텀 데이터 훈련영상 (0) | 2023.07.07 |
tensorflowjs 통해 첫 번째 웹 서비스 'Teachable Machine' 만들기 (0) | 2023.06.20 |
파이썬 flask에서 텐서플로 숫자 맞추기 웹서비스 해보기 (0) | 2023.06.20 |
텐서플(tenserflow)로 시작 해보기 (2) | 2023.06.18 |
Comments