GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
PCの無い所で、GR-LYCHEEを単独で動作させて
OpenCVを使用、画像を取得して、秋月電子TFT液晶モジュールATM0430D25に
カメラ画像を表示したいです。
開発は、IDE for GR を使用します。
表示する方法ご教授お願いします。
たとえば、以下のようなことがしたいです。
OpenCVで取得した画像をそのまま、TFT液晶モジュールATM0430D25に表示
OpenCVで取得した画像を、2値化加工してTFT液晶モジュールATM0430D25に表示など
がじぇるね岡宮です。
すみません、手持ちにLCDがなく確認できてないのですが、まずは以下のプログラムを実行してLCDにカメラ画像が映るか確認してみていただけますでしょうか?
OpenCVはプログラムに含めてません。
#include <Arduino.h>#include <Camera.h>#include "EasyAttach_CameraAndLCD.h"Camera camera(LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT);DisplayBase Display;static void Start_LCD_Display(void) { DisplayBase::rect_t rect; rect.vs = 0; rect.vw = LCD_PIXEL_HEIGHT; rect.hs = 0; rect.hw = LCD_PIXEL_WIDTH; Display.Graphics_Read_Setting( DisplayBase::GRAPHICS_LAYER_0, (void *)camera.getImageAdr(), FRAME_BUFFER_STRIDE, GRAPHICS_FORMAT, WR_RD_WRSWA, &rect ); Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0); Thread::wait(50); EasyAttach_LcdBacklight(true);}void setup(){ camera.begin(); Start_LCD_Display();}void loop(){}
まずはちゃんと表示されるようにしたサンプルを以下に示します。公開されているIDE for GR V1.02で確認済みです。
#include <Arduino.h>#include <Camera.h>#include "EasyAttach_CameraAndLCD.h"#define PIXEL_WIDTH 480#define PIXEL_HEIGHT 272#define ASPECT_RATIO_16_9 (1) // 0->4:3 1->16:9Camera camera(PIXEL_WIDTH, PIXEL_HEIGHT);DisplayBase Display;void lcd_begin(int x, int y, int width, int height, int stride, bool aspect) { if(aspect == 0){ EasyAttach_Init(Display); //aspect ratio 4:3 } else { EasyAttach_Init(Display, 640, 360); //aspect ratio 16:9 } DisplayBase::rect_t rect; rect.hs = x; rect.hw = x + width; rect.vs = y; rect.vw = y + height; Display.Graphics_Read_Setting(DisplayBase::GRAPHICS_LAYER_0, (void *) camera.getImageAdr(), stride, GRAPHICS_FORMAT, // YUV422 WR_RD_WRSWA, &rect); Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0); Thread::wait(50); EasyAttach_LcdBacklight(true);}void setup() { camera.begin(); lcd_begin(0, 0, PIXEL_WIDTH, PIXEL_HEIGHT, PIXEL_WIDTH * 2, ASPECT_RATIO_16_9);}void loop() {}
私の場合もフラットケーブルの接続は最初悩みましたが以下のように接続すればOKでした。
岡宮さんのサンプルプログラムを試しましたが、横に伸びた表示になるので、個人的には
Camera camera(PIXEL_WIDTH, PIXEL_WIDTH*3/4);の方が自然だと思いました。
また、液晶の端の画像が乱れていたのでオフセット調整してみました。
lcd_begin(4, -1, PIXEL_WIDTH, PIXEL_HEIGHT, PIXEL_WIDTH *2 ,ASPECT_RATIO_16_9);
あと、最後のパラメータは0でも1でも変化ないような気がします。
OpenCVでThresholdしてからのLCD表示を試してみました。
ちょっと変な黒い帯が出てしまうのですが、以下のようなプログラムで可能です。黒い帯については後で調べます。→d-katoさんにアドバイスいただいて、黒帯が出ないように修正しました。
Thresholdした後に、グレーからYUV422に変換してます。
#include <Arduino.h>#include <Camera.h>#include <opencv.hpp>#include "EasyAttach_CameraAndLCD.h"#include "dcache-control.h"using namespace cv;#define IMAGE_HW 480#define IMAGE_VW (IMAGE_HW*3/4)static uint8_t work_buf[BYTE_PER_PIXEL_YUV * IMAGE_HW * IMAGE_VW] __attribute((section("NC_BSS"),aligned(32)));Camera camera(IMAGE_HW, IMAGE_VW);DisplayBase Display;void lcd_begin(int x, int y, int width, int height, int stride, bool aspect) { if (aspect == 0) { EasyAttach_Init(Display); //aspect ratio 4:3 } else { EasyAttach_Init(Display, 640, 360); //aspect ratio 16:9 } DisplayBase::rect_t rect; rect.hs = x; rect.hw = x + width; rect.vs = y; rect.vw = y + height; Display.Graphics_Read_Setting(DisplayBase::GRAPHICS_LAYER_0, (void *) work_buf, stride, GRAPHICS_FORMAT, // YUV422 WR_RD_WRSWA, &rect); Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0); Thread::wait(50); EasyAttach_LcdBacklight(true);}void setup() { camera.begin(); lcd_begin(0, 0, IMAGE_HW, IMAGE_HW*9/16, IMAGE_HW * 2, 0); for (uint32_t i = 0; i < (uint32_t) (BYTE_PER_PIXEL_YUV * IMAGE_HW * IMAGE_VW); i += 2) { work_buf[i + 0] = 0x10; work_buf[i + 1] = 0x80; }}void loop() { Mat img_raw(IMAGE_VW, IMAGE_HW, CV_8UC2, camera.getImageAdr()); Mat src; cvtColor(img_raw, src, COLOR_YUV2GRAY_YUY2); // convert YUV to GRAY threshold(src, src, 128, 255, THRESH_BINARY); //threshold for (uint32_t i = 0; i < IMAGE_VW; i++) { for (uint32_t j = 0; j < IMAGE_HW; j++) { work_buf[(i * IMAGE_HW * BYTE_PER_PIXEL_YUV) + BYTE_PER_PIXEL_YUV * j] = src.data[i * IMAGE_HW + j]; } } delay(10);}
OpenCV使用して、LCDに表示できました!
原因は、LCDフラットケーブル斜めに差し込んでいました。
きわめて初歩的な事でした。
がじぇるね岡宮さま、maeno!さま
ご指導ありがとうございました。