Open11
wavesahre e-paper 7.5 inch で遊んでみた
raspberry pi 5 から e-paper に色々表示できるようにしたかったので購入した
raspberry pi 5 の純正ケースを使ってるとファンと鑑賞してつけられなかった
ドキュメント
c++ で動くように整備
opencv のインストール. apt 経由でインストール
sudo apt install libopencv-dev
自前でビルドする方法もあるみたいだが最新バージョンにこだわりが無いためaptを使用した
c++ で動くようにした e-paper 用コード.
wget https://github.com/joan2937/lg/archive/master.zip
unzip master.zip
cd lg-master
make
sudo make install
sudo apt install gpiod libgpiod-dev
def convert_to_grayscale_bmp(input_image, output_path, threshold=128):
# 画像を読み込む
image = cv2.imread(input_image)
if image is None:
print("画像の読み込みに失敗しました")
return
# グレースケールに変換
grayscale_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 2値化処理
_, binary_image = cv2.threshold(grayscale_image, threshold, 255, cv2.THRESH_BINARY)
# 2値画像をPIL形式に変換
pil_image = Image.fromarray(binary_image)
image = pil_image.convert("1")
# 出力パスに拡張子を追加
output_path_with_extension = output_path + ".bmp"
# 画像を保存
image.save(output_path_with_extension)
print(f"2値化したBMP画像を保存しました: {output_path_with_extension}")
return output_path_with_extension
python3でe-paper 用の2値画像作成関数.
一度opencv でいい感じに2値化してからpilでグレースケールで出力してる.
opencvでうまくグレースケールにできなかった.
from PIL import Image
def convert_to_grayscale_dots(input_image, output_path):
# 画像を読み込む
image = Image.open(input_image)
# グレースケールに変換
grayscale_image = image.convert("L")
# ディザリングを適用
dithered_image = grayscale_image.convert("1", dither=Image.FLOYDSTEINBERG)
# 画像を保存
dithered_image.save(output_path)
print(f"ディザリングを適用した画像を保存しました: {output_path}")
return output_path
ディザリングで白黒でもきれいに見える.
ドット感が強くなるけどこっちのほうが好き
curl のライブラリを使用して C++ から web API へのアクセス
GETだけ実装.
Yahooの天気APIから天気情報が取りたかった
sudo apt update
sudo apt install curl libcurl4 libcurl3-dev
curl.hpp
class Curl
{
public:
Curl();
~Curl();
std::string get(const std::string &url);
private:
void clean_up();
CURL *curl_;
};
curl.cpp
#include "curl.hpp"
#include <cstdlib>
#include <exception>
#include <stdexcept>
size_t callbackWrite(char *ptr, size_t size, size_t nmemb, std::string *stream)
{
int dataLength = size * nmemb;
stream->append(ptr, dataLength);
return dataLength;
}
Curl::Curl()
{
curl_ = curl_easy_init();
if (!curl_)
{
fprintf(stderr, "Failed to initialize curl\n");
std::exit(1);
}
}
Curl::~Curl()
{
this->clean_up();
}
void Curl::clean_up()
{
if (this->curl_)
{
curl_easy_cleanup(this->curl_);
}
}
std::string Curl::get(const std::string &url)
{
if (!this->curl_)
{
throw std::runtime_error("curl is not initialized");
}
std::string chunk;
CURLcode res;
curl_easy_setopt(this->curl_, CURLOPT_URL, url.c_str());
curl_easy_setopt(this->curl_, CURLOPT_WRITEFUNCTION, callbackWrite);
curl_easy_setopt(this->curl_, CURLOPT_WRITEDATA, &chunk);
res = curl_easy_perform(this->curl_);
if (res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
return chunk;
}