つれづれなる備忘録

日々の発見をあるがままに綴る

Texによる文書作成37 ~電気回路の作図7

今回はTeXを用いた電気回路図の作成のうちメーター・測定器の表示について紹介したい。

atatat.hatenablog.com

1. メーター

回路図中に、電流計、電圧計、抵抗計を追加することができる。電流計はammeter, 電圧計はvoltmeter, 抵抗計はohmmeterで表記することができる。

\begin{figure}
\begin{center}
\begin{circuitikz}
\draw(0,0) to [ammeter] ++(1,0); 
\draw(2,0) to [voltmeter] ++(1,0); 
\draw(4,0) to [ohmmeter] ++(1,0); 
\end{circuitikz}
\caption{メーター}
\end{center}
\end{figure}

"各種メータ"
各種メータ

単純な記号ではなく、測定器のイラストを挿入することもできる。汎用メータはsmeter、電流メータはqiprobe, 電圧メータはqvprobe, 電力メータはqpprobeとする。

\begin{figure}
\begin{center}
\begin{circuitikz}
\draw(0,0) to [smeter] ++(1,0); 
\draw(2,0) to [qiprobe] ++(1,0); 
\draw(4,0) to [qvprobe] ++(1,0); 
\draw(6,0) to [qpprobe] ++(1,0); 
\end{circuitikz}
\caption{メーター(ピクチャー)}
\end{center}
\end{figure}

"メータ(イラスト)"
メータ(イラスト)

メータ以外の測定器としてオシロスコープ、カレントループ(電流測定コイル)を表示でき、それぞれoscope, iloopとする。

\begin{figure}
\begin{center}
\begin{circuitikz}
\draw(0,0) to [oscope] ++(1,0); 
\draw(2,0.5) to [iloop] ++(0,-1); 
\end{circuitikz}
\caption{オシロスコープ・カレントループ}
\end{center}
\end{figure}

"オシロスコープとカレントループ"
オシロスコープとカレントループ

2. オシロスコープのカスタマイズ

 オシロスコープのイラストをカスタマイズすることができる。まず波形を変えるには\ctikzset{bipoles/oscope/waveform=}のwaveform=にramps(デフォルト), sin, square, triangle, lissajous, zero, noneのいずれかを入れる。表示は\draw node[oscopeshape]{}とするとctikzsetに記述した波形でオシロスコープのイラストが表示される。

\begin{figure}
\begin{center}
\begin{circuitikz}
\ctikzset{bipoles/oscope/waveform=ramps}
\draw(0,0) to node[oscopeshape]{} ++(1,0); 
\ctikzset{bipoles/oscope/waveform=sin}
\draw(2,0) to node[oscopeshape]{} ++(1,0); 
\ctikzset{bipoles/oscope/waveform=square}
\draw(4,0) to node[oscopeshape]{} ++(1,0);
\ctikzset{bipoles/oscope/waveform=triangle}
\draw(6,0) to node[oscopeshape]{} ++(1,0); 
\end{circuitikz}
\caption{オシロスコープ(波形1)}
\end{center}
\end{figure}

"オシロスコープ(波形1)"
オシロスコープ(波形1)

\begin{figure}
\begin{center}
\begin{circuitikz}
\ctikzset{bipoles/oscope/waveform=lissajous}
\draw(0,0) to node[oscopeshape]{} ++(1,0); 
\ctikzset{bipoles/oscope/waveform=zero}
\draw(2,0) to node[oscopeshape]{} ++(1,0); 
\ctikzset{bipoles/oscope/waveform=none}
\draw(4,0) to node[oscopeshape]{} ++(1,0); 
\end{circuitikz}
\caption{オシロスコープ(波形2)}
\end{center}
\end{figure}

"オシロスコープ(波形2)"
オシロスコープ(波形2)

次にオシロスコープのサイズは、\ctikzset{bipoles/oscope/width=1.0}として設定できる。またメータも含めてfillオプションで色をつけることもできる。

\begin{figure}
\begin{center}
\begin{circuitikz}
\ctikzset{bipoles/oscope/width=1.0}
\ctikzset{bipoles/oscope/waveform=ramps}
\draw(0,0) to node[oscopeshape]{} ++(1,0); 
\ctikzset{bipoles/oscope/waveform=sin}
\draw(2,0) to node[oscopeshape,fill=yellow]{} ++(1,0); 
\ctikzset{bipoles/oscope/waveform=square}
\draw(4,0) to node[oscopeshape]{} ++(1,0);
\ctikzset{bipoles/oscope/waveform=triangle}
\draw(6,0) to node[oscopeshape]{} ++(1,0); 
\end{circuitikz}
\caption{オシロスコープ(カスタマイズ)}
\end{center}
\end{figure}

オシロスコープのカスタマイズ
オシロスコープのカスタマイズ

3. オシロスコープの接続

最後にカレントループとオシロスコープを接続して描画する方法を紹介する。カレントループの右側の接続点(飛び出ているところ)とオシロスコープの入力を接続するために直接座標値を使わず、それぞれのオプションで座標を指定する。 カレントループの名前をIとしてI.iがループの接続点を示し、オシロスコープのオプションでancorを指定することで左側または右側に接続することができる。 また、オシロスコープの名前をOとした場合にO.southオシロスコープの下側の座標を意味する。以下にオシロスコープとカレントループの接続例を示す。

\begin{figure}
\begin{center}
\begin{circuitikz}[american]
\draw (3,0) to [iloop, name=I] ++(0,-2) node[ground] (GND){};
\draw (I.i) -- ++(0.5,0) node[oscopeshape, anchor=left, name=O]{};
\draw (O.south) -- (O.south |- GND) node[ground]{};
\end{circuitikz}
\caption{オシロスコープ接続}
\end{center}
\end{figure}

オシロスコープの接続
オシロスコープの接続

4. まとめ

 今回はメータの記号・イラストの表示、オシロスコープの表示とカスタマイズについて紹介した。

OpenCVの使い方25 ~ 輪郭抽出2

今回はOpenCVを用いて画像の輪郭を抽出する際の検出手法の違いについて紹介したい。

前回紹介したように輪郭検出方法は次の4種類:cv2.RETR_EXTERNAL, cv2.RETR_LIST, cv2.RETR_CCOMP, cv2.RETR_TREEがあり、前回はcv2.RETR_TREEを使用した。

atatat.hatenablog.com

今回は他の輪郭検出手法を用いて輪郭抽出したときの結果の違いを調べる。

画像はOpenCVのモノクロロゴをグレーで読み込むところまでは前回と同じ。

ret,thresh = cv2.threshold(gray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnt_img = np.zeros_like(gray, dtype=np.uint8) 
cnt_img_tree = cv2.drawContours(cnt_img, contours, -1, 255, 2)

contours_ex, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnt_img = np.zeros_like(gray, dtype=np.uint8) 
cnt_img_ex = cv2.drawContours(cnt_img, contours, -1, 255, 2)

contours_list, hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt_img = np.zeros_like(gray, dtype=np.uint8) 
cnt_img_list = cv2.drawContours(cnt_img, contours, -1, 255, 2)

contours_comp, hierarchy = cv2.findContours(thresh,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
cnt_img = np.zeros_like(gray, dtype=np.uint8) 
cnt_img_comp = cv2.drawContours(cnt_img, contours, -1, 255, 2)

plt.figure(figsize=(15,25))
plt.subplot(1,4,1)
plt.imshow(cnt_img_tree,cmap='gray')
plt.title('RETR_TREE')
plt.subplot(1,4,2)
plt.imshow(cnt_img_ex,cmap='gray')
plt.title('RETR_EXTERNAL')
plt.subplot(1,4,3)
plt.imshow(cnt_img_list,cmap='gray')
plt.title('RETR_LIST')
plt.subplot(1,4,4)
plt.imshow(cnt_img_comp,cmap='gray')
plt.title('RETR_CCOMP')

"輪郭検出比較"
輪郭検出比較

RETR_EXTERNALは外側の輪郭のみを抽出するためO,P,eの内側が輪郭として抽出されない。RETR_EXTERNAL以外はすべて同じ結果になる。

RETR_EXERNALで抽出した輪郭を輪郭リストの番号で示すと以下のようになる。

n=len(contours_ex)
plt.figure(figsize=(12,12))
for i in np.arange(n):
  cnt_img = np.zeros_like(thresh, dtype=np.uint8) 
  cnt_img = cv2.drawContours(cnt_img, contours_ex,i, 255, 2)
  plt.subplot(3,4,i+1)
  plt.imshow(cnt_img,cmap='gray')
  plt.title('Cont Num'+str(i))

"RETR_EXTERNALの各輪郭"
RETR_EXTERNALの各輪郭

cv2.RETR_LIST, cv2.RETR_CCOMP, cv2.RETR_TREEは輪郭抽出については差がなかったが、内側の輪郭の階層構成について差がある。

www.learning-nao.com

抽出した輪郭をさらに処理するときに違いを理解しておくことが必要になる。

ブログデザイン備忘録 ~ GA4

今回はGoogleアナリティクス4(GA4)の設定とはてなブログの追加データを設定して表示した結果について紹介したい。

Googleアナリティクスの設定については以下の通り。

help.hatenablog.com

基本的にはGoogleアナリティクス側でGから始まる測定IDをコピーして、はてなブログの設定-詳細設定のGoogleアナリティクス4埋め込みに貼り付ける。

なお、従来のGoolgeアナリティクス:ユニバーサルアナリティクスのUAからはじまるIDを非推奨:Google Analytics埋め込みに入れておくと、ユニバーサルアナリティクスGoogleとアナリティクス4を併用することができる。ただしユニバーサルアナリティスクは来年の2023/7/1で終了する。

さらにGoogleアナリティクス4でカスタムディメンジョンを追加することで、はてなブログ用の解析データを取得することができる。 設定方法は以下の通り。

staff.hatenablog.com

追加したカスタムディメンジョンの閲覧をするには、Googleアナリティクス4のエンゲージメント-イベントを開く。

イベント

例えばイベントの"Scroll"をクリックすると、POST_DATE, TRACK_AREA, PERCENT_SCROLLEDが追加のデータとして閲覧できる。

記事が読了されているか、またスクロール率でどの程度まで読まれたかわかる。

"TRACK_AREA"
TRACK_AREA

"PERCENT_SCROLLED"
PERCENT_SCROLLED

他にイベントの"Click"をクリックすると、POST_DATE,LINK_TEXT,LINK_URL,OUTBOUND,TRACK_COMPONENT,LINK_CLASSES, TRACK_AREA,LINK_ID,LINK_DOMAINが表示される。例えばLINK_TEXTでは、貼り付けたリンク先やブログ内の移動の状況がわかる。

"LINK_TEXT"
LINK_TEXT