投稿

3月, 2020の投稿を表示しています

githubへ既存のプロジェクトを登録

ローカルのプロジェクトをGitHubへアップロードする方法 こちらを参考にしました GitHubのマイページにあるRepositoriesタブを開き、Newボタンを押下します。 リポジトリ名(プロジェクト名)を入力して、空っぽの新規レポジトリを作成しておきます。 次に、ローカルで以下を実行します。 # GitHubへアップロードしたいプロジェクトディレクトリへ移動 $ cd /path/to/your/project $ git init # 必要であれば.gitignoreを作成し、バージョン管理しないファイルやディレクトリを記載(例:*.log) $ vim .gitignore # プロジェクトディレクトリ内にあるファイルやディレクトリを全てコミット $ git add . $ git commit -m "Initial Commit" # 先ほど作成したGitHubリポジトリのURLをコピー&ペーストして、リモートブランチとして設定 git remote add origin https://github.com/your-name/project-name.git # ローカルのファイルをアップロード git push -u origin master

Python リストを合成したクラス

#関数とメソッドの違いってなに? より # # 対話モード >>> に # コピペで実行できます。 # class Container: def __init__(self, *args): self._values = args def __getitem__(self, index): return self._values[index] def __iter__(self): return iter(self._values) def __len__(self): return len(self._values) container = Container(0, 1, 2) # 1) 直接、添字表記で参照できる。 container[0] container[1] container[2] # 2) 直接、for 文で回せる。 for element in container: element # 3) 直接、len 関数でオブジェクトの長さを取得できる。 len(container) >>> # 1) 直接、添字表記で参照できる。 ... container[0] 0 >>> container[1] 1 >>> container[2] 2 >>> >>> # 2) 直接、for 文で回せる。 ... for element in container: ... element ... 0 1 2 >>> # 3) 直接、len 関数でオブジェクトの長さを取得できる。 ... len(container) 3 >>> class Container(tuple): def __new__(cls, *args): return super().__new__(cls, args) container = Container(0, 1, 2) # 1) 直接、添字表記で参照できる。 container[0] con

vb.net 途中のフォルダ作成

if dir(saveFileName) = "" then System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(saveFileName)) end if

VB.net Dictionaryクラスの初期化

[ VB.NET ] From による List, Dictionary クラスの初期化 ( VB2010 ) より VB2010以降で使える 変換テーブルのコードが要らなくなって便利 ' List クラスの初期化 Dim list As New List(Of String) From { "Item1", "Item2" } ' Dictionary クラスの初期化 Dim dect As New Dictionary(Of Integer, String) From { {0, "Item1"}, {1, "Item2"} }

Python openCV 射影変換

射影変換 を動かしてみた。 射影変換の導出式 によると 射影変換 任意の四角形を任意の四角形に変形することができる変換が射影変換です。 よって4組の対応点の座標が必要になります。 射影変換>アフィン変換>合同変換 import numpy as np import cv2 import matplotlib.pyplot as plt #Affine変換 img = cv2.imread("logo.png") rows,cols,ch = img.shape pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(300,300)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()

Python openCV アフィン変換

イメージ
アフィン変換とは 線形変換(拡大縮小、剪断、回転)と並行移動を組み合わせたもの。 数学的には行列の1次変換とベクトルの和ですね。変換前の辺の長さの比が変換後も変わらない。 指定には変換前、変換後の各3点の座標が必要 (1,0)→(a,c) (0,1)→(b,d)に変換して(tx,ty)分並行移動するので3点分の情報がいるのは納得 import numpy as np import cv2 import matplotlib.pyplot as plt #Affine変換 img = cv2.imread("logo.png") rows,cols,ch = img.shape pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv2.getAffineTransform(pts1,pts2) dst = cv2.warpAffine(img,M,(cols,rows)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()

Python openCV 画像の回転、移動、拡大

画像の幾何変換 こちらの例を動かしてみた。 import numpy as np import cv2 #拡大 img = cv2.imread("logo.png") res = cv2.resize(img,None,fx=3,fy=2,interpolation = cv2.INTER_CUBIC) cv2.imshow('image',res) cv2.waitKey(0) cv2.destroyAllWindows() #移動 #Warning cv2.warpAffine() 関数の第3引数には #出力画像のサイズを (width, height) という形式で指定しなければいけません. #widthは列の数,heightは行の数です # # Mはnp.float32の移動行列 # # +- -+ # | 1 0 x | # M = | | # | 0 1 y | # +- -+ # img = cv2.imread("logo.png") #print(img.shape) rows,cols,ch = img.shape M = np.float32([[1,0,100],[0,1,50]]) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('image',dst) cv2.waitKey(0) cv2.destroyAllWindows() #回転 img = cv2.imread("logo.png") rows,cols,ch = img.shape M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('image',dst) cv2.waitKey(0) cv2.destroyAllWindows()

vb.net 呼び出し元の引数の変数名を表示する

呼び出し元の引数の変数名を取得できた。他言語のEval()があれば、またはVB14以降なら変数の値も表示できそうだが・・・ add(1,3) x y 4 Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Debug.Print(add(1, 3)) End Sub Function add(x As Integer, y As Integer) As Integer FuncPrint(x, y) Return x + y End Function ''' ''' 入力チェック ''' ''' 変数を与える(可変長) Public Sub FuncPrint(ParamArray args As Object()) Dim s As String = "" If (args Is Nothing) Or (args.Length = 0) Then '引数なし Else s = String.Join(",", args) End If s = New StackFrame(1).GetMethod.Name + "(" + s + ")" Debug.Print(s) For Each item In New StackFrame(1).GetMethod.GetParameters Debug.Print(item.Name) Next End Sub End Class

VB.net 呼び出したモジュール名と引数をログ出力する

引数を与えて呼ぶと、呼び出し元のモジュール名と引数を表示するモジュールFuncPrint()を作ってみた。 実行すると、以下のように呼び出しモジュール名と引数を表示する。 add(2,5) 7 addStr(A,B,3) AB3 Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Debug.Print(add(2, 5)) Debug.Print(addStr("A", "B", 3)) End Sub Function add(x As Integer, y As Integer) As Integer FuncPrint(x, y) Return x + y End Function Function addStr(a As String, b As String, c As Integer) As String FuncPrint(a, b, c) Return a + b + c.ToString() End Function ''' ''' 入力チェック ''' ''' 変数を与える(可変長) Public Sub FuncPrint(ParamArray args As Object()) Dim s As String = "" If (args Is Nothing) Or (args.Length = 0) Then '引数なし Else s = String.Join(",", args) End If s = New Stack

VB.NET 配列をカンマ区切りの文字列に変換する

VB.NET 配列をカンマ区切りの文字列に変換する ループでやると端の処理が面倒 Dim arr As String() = {"月", "火", "水"} Dim str As String = String.Join(",", arr) Console.WriteLine(str) '出力結果 '月,火,水

VB.NET 実行中のクラス名とメソッド名を取得

実行中のクラス名とメソッド名を取得する を参考にした。エラーをログ出力するときにクラスとメソッドを出せると便利 クラス名 Console.WriteLine(MyClass.GetType.ToString) メソッド名 Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod.Name) 実行中のメソッドをメソッド内で取得する こちらに書いてあった以下の方法を使うとさらに便利。共通メソッド化できる。エラー時にログ出力するときにつけておけば、メソッドの呼び出し元のメソッド名がわかって便利 Public Sub DebugWriteLineMethodName() Debug.WriteLine(New StackFrame(1).GetMethod.Name) End Sub

検査ライン用業務無線LAN

おすすめ業務用Wi-Fiルーター6選! こちらにあったBRT-AC828(ASUS)標準価格:39,800円  1台で最大250台の同時接続が可能。これが欲しいな

Visual Studi 2010の単体テストでのファイルの参照

実行ファイルのあるフォルダのパラメータファイルを参照するときに、Visual Studioの単体テストでは実行ファイルが独自のフォルダに作成されて参照できなかった。 Visual Studi 2010の単体テストでのファイルの参照 こちらの方法を参考に参照することができた。 あと、単体テスト自動生成時に出てくる以下は単体テストをコーディングしたらコメントアウトして消す。 残っていると実行時にエラーとなるので、単体テスト未実装とわかる 'Assert.Inconclusive("このテストメソッドの正確性を確認します。") ■方法1  テストプロジェクト全体での指定。  1.Visual Studio 2010のメニューの[テスト(S)]-[テスト設定の編集(S)]-[ローカル(local.testsettings)]を選択しテスト設定画面を開く。  2.テスト設定画面内の[配置]をクリックして、[配置する追加ファイルおよびディレクトリ(P)]にファイルかディレクトリを追加する。  これでテストの度に動的に作成されるディレクトリに指定したファイルがコピーされるようになります。ただし、配置先のディレクトリの指定が出来ません。

Python + OpenCVで青い物体だけ検出

色空間の変換 WEBカメラの画像から青い物体だけ抽出できる。凄い。 import cv2 import numpy as np cap = cv2.VideoCapture(0) while(1): # Take each frame _, frame = cap.read() # Convert BGR to HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of blue color in HSV lower_blue = np.array([110,50,50]) upper_blue = np.array([130,255,255]) # Threshold the HSV image to get only blue colors mask = cv2.inRange(hsv, lower_blue, upper_blue) # Bitwise-AND mask and original image res = cv2.bitwise_and(frame,frame, mask= mask) cv2.imshow('frame',frame) cv2.imshow('mask',mask) cv2.imshow('res',res) k = cv2.waitKey(5) & 0xFF if k == 27: break cv2.destroyAllWindows() 追跡する色(HSV)を調べる方法 >>> green = np.uint8([[[0,255,0 ]]]) >>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV) >>> print hsv_green [[[ 60 255 255]]] 下界と上界をそれぞれ [H-10, 100,100]と[H+10, 255, 255] に設定 HSVの各成分はそれぞれ,Hueが色相,

明度と彩度の違い

イメージ
明度と彩度の違い ここの説明で謎が解けた 彩度 白や黒に対する純色の色の量。純色の量が多いほど鮮やかで少ないほど淡くなる。 明度 白の量が多いほど明るく、黒の量が多いほど暗くなる。

治具に使えそうなもの色々 T溝

アルミ構造材 SF共通パーツ Tスロットフレーム (カット品) ベーシックフレーム M6シリーズ ヘビー級 AFS-15150B T溝 取付プレート クイック・クランプやダウンホールド・クランプ用 平ストッパ T・L寸選択/指定タイプ https://jp.misumi-ec.com/procurement/vona2/detail/110300138810/ T溝ナット https://jp.misumi-ec.com/procurement/vona2/detail/110300251670/ 製缶用蜂ノ巣定盤 https://www.monotaro.com/g/01378709/ MCサブテーブル(タップ穴タイプ) https://www.monotaro.com/g/01107827/ アングルブラケット https://www.monotaro.com/g/03483246/ ねじ穴付きストラップ https://www.imao.co.jp/catalog/categoryviews/?categorycode=$WHSCST,$WHS&category=$600226&page=1

Pythonのreduce

高階関数の使い方!Pythonでreduceを使う方法【初心者向け】 reduceは、 第1引数にfunction(必須) 第2引数にiterable(必須) 第3引数にinitializer(オプション) を指定できます。 第1引数には2つの引数を取るfunctionを指定する必要があります。 第2引数にはiterableを指定する必要があります。 第3引数にはオプションですが、指定された場合、iterableの先頭に置かれ、iterableが空の場合のデフォルト値になります。また第1引数にはfunctionの代わりにラムダ式を使用する事もできます。 from functools import reduce reduce(function, iterable, initializer) from functools import reduce a = range(10) b = reduce(lambda x,y:x + y,a,10) print(b)

pythonのmap(),filter()はリストを返さない(イテレーターを返す)list()でリスト化すること

python の map オブジェクトを list にした後は何も残らない map(),filter()を使った後はlist()でリスト化しないと消えてしまう。

pythonのsum()を使うと複雑なリストを1次元リストにできる

便利 a=[[1,2,3],[4,5,6]] b = sum(a,[]) print(b) #[1, 2, 3, 4, 5, 6]

python3で改行なしでprintする

python3で改行なしでprintする こちらを参考にしました。 print("HOGE", end="")

Pythonを実行ファイル(exe化)する

PythonスクリプトをWindows環境で動くexeファイルにしよう! こちらを参考にしました。 pyinstallerを入れる pip install pyinstaller コマンドラインで以下を実行(例 test.pyを実行ファイル化する場合) pyinstaller test.py --onefile distフォルダ内にexeファイルができる

Python OpenCV で文字認識(OCR)

Python OpenCV で文字認識(OCR)をやってみた。 (最終回)Python + OpenCVで遊んでみる(OCR編) こちらのサイトを参考にした。 こちら から 「tesseract-ocr」をダウンロード。64bit版をDLした tesseract-ocr-w64-setup-v5.0.0-alpha.20200223.exe (64 bit) resp. OCRデータ をダウンロードする Data Files for Version 4.00 (November 29, 2016) jpn Japanese jpn.traineddata jpn.traineddataを以下のフォルダにコピーする。 C:\Program Files\Tesseract-OCR\tessdata インストール後、下記のパスを環境変数に登録します。 Pathに「C:\Program Files\Tesseract-OCR」を追加する。 環境変数項目としてTESSDATA_PREFIXを作成して、「C:\Program Files\Tesseract-OCR\tessdata」を追加する pyocrをインストールする pip install pyocr これで文字認識した。どのくらいの精度があるのかはまだ確認していない。 import pyocr import pyocr.builders import cv2 from PIL import Image import sys #利用可能なOCRツールを取得 tools = pyocr.get_available_tools() if len(tools) == 0: print("OCRツールが見つかりませんでした。") sys.exit(1) #利用可能なOCRツールはtesseractしか導入していないため、0番目のツールを利用 tool = tools[0] #画像から文字列を取得 res = tool.image_to_string(Image.open("doc.png"),lang="jpn",builder=pyocr.builders.WordBoxBuild

Python OpenCVとWebカメラでバーコードリーダー

これがやってみたかった。 QRコードリーダーをOpenCVとTkinterで作る 一次元バーコードも認識するみたい。 pyzbarをインストール pip install pyzbar """ OpenCVの動画取得機能を利用し、TkのCanvasに描画して、QRコードを認識させるプログラム """ from datetime import datetime from time import sleep import tkinter import cv2 from PIL import Image, ImageTk from pyzbar import pyzbar root = tkinter.Tk() root.title("QR reader") root.geometry("640x480") CANVAS_X = 640 CANVAS_Y = 480 # Canvas作成 canvas = tkinter.Canvas(root, width=CANVAS_X, height=CANVAS_Y) canvas.pack() # VideoCaptureの引数にカメラ番号を入れる。 # デフォルトでは0、ノートPCの内臓Webカメラは0、別にUSBカメラを接続した場合は1を入れる。 cap = cv2.VideoCapture(0) def show_frame(): global CANVAS_X, CANVAS_Y ret, frame = cap.read() if ret == False: print('カメラから画像を取得できませんでした') image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # BGRなのでRGBに変換 image_pil = Image.fromarray(image_rgb) # RGBからPILフォーマットへ変換 image_tk = ImageTk.PhotoImage(image_pil) # ImageTkフォーマットへ変換 # image_t

PythonとOpenCVを使用して画像のバーコードを認識する

PythonとOpenCVを使用して画像のバーコードを認識する こっちは複雑そうだ

OpenCV PythonでQRコード作成、読込

QRコード作成 【QRコード】画像の生成 以下のモジュールをインストール pip install pillow pip install qrcode # -*- coding: utf-8 -*- import qrcode data = 'https://algorithm.joho.info' # 引数の文字列をQRコードに変換 img = qrcode.make(data) # QRコード画像の出力 img.save('output.png') QRコード読込 【Python/OpenCV4】QRコードの検出・読み取り # -*- coding: utf-8 -*- import cv2 # 入力画像のロード img = cv2.imread('qrcode.png') # データ、検出領域の四隅の座標、QRコードのバージョン情報を取得 qr = cv2.QRCodeDetector() data, points, straight_qrcode = qr.detectAndDecode(img) print('データ:', data) print("バージョン:", ((straight_qrcode.shape[0] - 21) / 4) + 1) """ データ: https://algorithm.joho.info バージョン: 2.0 """ 傾いても読めるのかな? QRコード検出APIの解説

AI・ディープラーニングを用いた検査自動化ソフトウェア「SDTest」をオープンソースでリリースへ!

AI・ディープラーニングを用いた検査自動化ソフトウェア「SDTest」をオープンソースでリリースへ! こういうのもあるのですね。

画像検査

がんばる人のための画像検査機 後で読みます。

OpenCV + Pythonで特定の図形を検出する

OpenCV + Pythonで特定の図形を検出する1(図形の領域を矩形で取得) 確かにここの輪郭を検出しているようだ。 import cv2 as cv def main(): # ファイルを読み込み image_file = 'debug_1.png' src = cv.imread(image_file, cv.IMREAD_COLOR) # 画像の大きさ取得 height, width, channels = src.shape image_size = height * width # グレースケール化 img_gray = cv.cvtColor(src, cv.COLOR_RGB2GRAY) # しきい値指定によるフィルタリング retval, dst = cv.threshold(img_gray, 127, 255, cv.THRESH_TOZERO_INV ) # 白黒の反転 dst = cv.bitwise_not(dst) # 再度フィルタリング retval, dst = cv.threshold(dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # 輪郭を抽出 #dst, contours, hierarchy = cv.findContours(dst, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) contours, hierarchy = cv.findContours(dst, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # この時点での状態をデバッグ出力 dst = cv.imread(image_file, cv.IMREAD_COLOR) dst = cv.drawContours(dst, contours, -1, (0, 0, 255, 255), 2, cv.LINE_AA) cv.imwrite('debug_1.png', dst) dst = cv.imread(image_fil

実際のラベルを使って輪郭を出してみた。

イメージ
輪郭: 初めの一歩 import cv2 # 画像ファイルの読み込み img = cv2.imread('label.png') cv2.imshow('org',img) cv2.waitKey(0) imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',imgray) cv2.waitKey(0) ret,thresh = cv2.threshold(imgray,127,255,0) cv2.imshow('thresh',thresh) cv2.waitKey(0) #image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print(len(contours)) img = cv2.drawContours(img, contours, -1, (0,255,0), 3) # 表示 cv2.imshow("outall", img) cv2.waitKey(0) #for i in range(len(contours)): # print(i) # img = cv2.drawContours(img, contours, i, (0,255,0), 3) # # 表示 # cv2.imshow(str(i), img) # cv2.waitKey(0) cv2.destroyAllWindows() 注)ラベル本体は手書きで黒塗りにしています。

OpenCV3とPython3で特徴点を抽出する

OpenCV3とPython3で特徴点を抽出する(AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob, SIFT) 動いたけど、まだ用途が良く分かっていない。 import cv2 # 画像ファイルの読み込み img = cv2.imread('org.jpg') # ORB (Oriented FAST and Rotated BRIEF) detector = cv2.ORB_create() # 特徴検出 keypoints = detector.detect(img) # 画像への特徴点の書き込み out = cv2.drawKeypoints(img, keypoints, None) # 表示 cv2.imshow("keypoints", out)

OpenCVのフィルタ

エッジ検出検出に使うのかな? OpenCVで各種フィルター処理をする(グラディエント、ハイパス、ラプラシアン、ガウシアン) 各種フィルター 今回紹介するフィルターは以下になります。 ハイパス フィルタ  方向に関係なくエッジを抽出することができます。   グラディエント フィルタ  1次微分フィルタと呼ばれることもあります。1方向のエッジ抽出を行うことができます。カーネルを回転させることで、上下方向、左右方向のどの方向のエッジを抽出するのかを指定することができます。   ラプラシアン フィルタ  2次微分フィルタと呼ばれることもあります。平面の全方向のエッジ抽出します。   ガウシアン フィルタ  平滑化フィルタの1種です。ノイズ除去に用います。ただし、カーネルが粗いと、かえってノイズがのってしまうこともあります。

OpenCV Pythonでエッジ検出

OpenCVでエッジ検出してみる こちらのサイトのコードを動かしてみる。 問題なく動いたが、なんに使うのだろう?輪郭検出は凄く興味があるが 何となく自分がコンピュータービジョンに興味があることがだんだんわかってきた。 import cv2 # 定数定義 ORG_WINDOW_NAME = "org" GRAY_WINDOW_NAME = "gray" CANNY_WINDOW_NAME = "canny" ORG_FILE_NAME = "org.jpg" GRAY_FILE_NAME = "gray.png" CANNY_FILE_NAME = "canny.png" # 元の画像を読み込む org_img = cv2.imread(ORG_FILE_NAME, cv2.IMREAD_UNCHANGED) # グレースケールに変換 gray_img = cv2.imread(ORG_FILE_NAME, cv2.IMREAD_GRAYSCALE) # エッジ抽出 canny_img = cv2.Canny(gray_img, 50, 110) # ウィンドウに表示 cv2.namedWindow(ORG_WINDOW_NAME) cv2.namedWindow(GRAY_WINDOW_NAME) cv2.namedWindow(CANNY_WINDOW_NAME) cv2.imshow(ORG_WINDOW_NAME, org_img) cv2.imshow(GRAY_WINDOW_NAME, gray_img) cv2.imshow(CANNY_WINDOW_NAME, canny_img) # ファイルに保存 cv2.imwrite(GRAY_FILE_NAME, gray_img) cv2.imwrite(CANNY_FILE_NAME, canny_img) # 終了処理 cv2.waitKey(0) cv2.destroyAllWindows()

OpenCV3とPython3で形状のある物体の輪郭と方向を認識する(主成分分析:PCA、固有ベクトル)

イメージ
OpenCV3とPython3で形状のある物体の輪郭と方向を認識する(主成分分析:PCA、固有ベクトル) こちらのコードを参考に動かしてみた。一か所修正で動いた。 コードの意味はまだよくわからないが、すごいな。 ラベルの外観検査の傾き検出に使えそうだ。 # -*- coding: utf-8 -*- import cv2 import math import numpy as np # ベクトルを描画する def drawAxis(img, start_pt, vec, colour, length): # アンチエイリアス CV_AA = 16 # 終了点 end_pt = (int(start_pt[0] + length * vec[0]), int(start_pt[1] + length * vec[1])) # 中心を描画 cv2.circle(img, (int(start_pt[0]), int(start_pt[1])), 5, colour, 1) # 軸線を描画 cv2.line(img, (int(start_pt[0]), int(start_pt[1])), end_pt, colour, 1, CV_AA); # 先端の矢印を描画 angle = math.atan2(vec[1], vec[0]) print(angle) qx0 = int(end_pt[0] - 9 * math.cos(angle + math.pi / 4)); qy0 = int(end_pt[1] - 9 * math.sin(angle + math.pi / 4)); cv2.line(img, end_pt, (qx0, qy0), colour, 1, CV_AA); qx1 = int(end_pt[0] - 9 * math.cos(angle - math.pi / 4)); qy1 = int(end_pt[1] - 9 * math.sin(angle - math.pi / 4)); cv2.line(img, end_pt, (qx1, qy1), colour, 1, CV_

NumPyで条件に応じた処理を行うnp.whereの使い方

NumPyで条件に応じた処理を行うnp.whereの使い方 np.whereを使うとmap()のようなことができるらしい。便利そうだ np.where(a,x,y) aが条件式、Trueならx,Falseならyの値に書き換える import numpy as np a = np.arange(9).reshape((3, 3)) print(a) # [[0 1 2] # [3 4 5] # [6 7 8]] print(np.where(a < 4, -1, 100)) # [[ -1 -1 -1] # [ -1 100 100] # [100 100 100]] print(np.where((a > 2) & (a < 6) | (a == 7), -1, 100)) # [[100 100 100] # [ -1 -1 -1] # [100 -1 100]] #条件を満たす要素を置換 print(np.where(a < 4, -1, a)) # [[-1 -1 -1] # [-1 4 5] # [ 6 7 8]] print(np.where(a < 4, a, 100)) # [[ 0 1 2] # [ 3 100 100] # [100 100 100]] #条件を満たす要素を処理 print(np.where(a < 4, a * 10, a)) # [[ 0 10 20] # [30 4 5] # [ 6 7 8]] #条件を満たす要素のインデックス(位置)を取得 print(np.where(a < 4)) # (array([0, 0, 0, 1]), array([0, 1, 2, 0])) print(type(np.where(a < 4))) # print(list(zip(*np.where(a < 4)))) # [(0, 0), (0, 1), (0, 2), (1, 0)]

OpenCV ビット処理

OpenCVのビット処理 import numpy as np import cv2 # Load two images img1 = cv2.imread('roi.jpg') img2 = cv2.imread('opencv.png') # I want to put logo on top-left corner, So I create a ROI rows,cols,channels = img2.shape roi = img1[0:rows, 0:cols ] # Now create a mask of logo and create its inverse mask also img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) cv2.imshow('img2gray',img2gray) cv2.waitKey(0) #関数は cv2.threshold を使います.第1引数は入力画像で #グレースケール画像でなければいけません . #第2引数はしきい値で,画素値を識別するために使われます. #第3引数は最大値でしきい値以上(指定するフラグ次第では以下) #の値を持つ画素に対して割り当てられる値です. #OpenCVは幾つかのしきい値処理を用意しており, #第4引数にて指定します.以下がフラグの一覧です: # #cv2.THRESH_BINARY #cv2.THRESH_BINARY_INV #cv2.THRESH_TRUNC #cv2.THRESH_TOZERO #cv2.THRESH_TOZERO_INV ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) cv2.imshow('mask',mask) cv2.waitKey(0) mask_inv = cv2.bitwise_not(mask) cv2.imshow('mask_inv',mask_inv) cv2.waitKey(0) #cv2.bitwise_and(画像1,画像2,mask = マスク画像) #画像1と画像2が同じ画像の場合、andをとっても

OpenCV 画像のブレンド

画像のブレンド import numpy as np import cv2 img = cv2.imread("img20200312090232.png") img2 = cv2.imread("img20200310113646.png") #img3 = cv2.addWeighted(img1,α,img2,β,γ) #img3 = α・img1 + β・img2 + γ img3 = cv2.addWeighted(img,0.7,img2,0.3,0) cv2.imshow('image',img3) cv2.waitKey(0) cv2.destroyAllWindows()

OpenCV 画像の足し算

画像の足し算 #画像の足し算は,OpenCVの関数 cv2.add() を使う, #もしくはNumpyの処理によってビット数,データ型が同じ #2枚の画像を res = img1 + img2 と足すか, #res = img + value のように画像全体を明るくする方法があります. # #OpenCVとNumpyの足し算は和の値が画素値の上限値を超えた時の処理が異なります. #OpenCVの cv2.add() 関数を使った場合,上限値を超える和の値は #res = min(img1+img2, MAX)``の ように打ち切られます. #一方でNumpyの足し算はモジュロを取った値に ``res = (img1+img2) mod MAX となります. # #この現象は2枚の画像を足し合わせた時によりはっきり確認できます. #OpenCVの足し算を使った方がよい結果になるでしょう. #常にOpenCVの関数を使うと良いでしょう. import cv2 import numpy as np x = np.uint8([250]) y = np.uint8([10]) print( cv2.add(x,y)) # 250+10 = 260 => 255 print( x+y ) # 250+10 = 260 % 256 = 4 img = cv2.imread("img20200312090232.png") img2 = cv2.imread("img20200310113646.png") img3 = cv2.add(img,100) cv2.imshow('image',img3) cv2.waitKey(0) img4 = cv2.add(img,img2) cv2.imshow('image',img4) cv2.waitKey(0) cv2.destroyAllWindows()

OpenCV カラーパレットとしてのトラックバー

トラックバーの使用例 import cv2 import numpy as np def nothing(x): pass # Create a black image, a window img = np.zeros((300,512,3), np.uint8) cv2.namedWindow('image') # create trackbars for color change cv2.createTrackbar('R','image',0,255,nothing) cv2.createTrackbar('G','image',0,255,nothing) cv2.createTrackbar('B','image',0,255,nothing) # create switch for ON/OFF functionality switch = '0 : OFF \n1 : ON' cv2.createTrackbar(switch, 'image',0,1,nothing) while(1): cv2.imshow('image',img) k = cv2.waitKey(1) & 0xFF if k == 27: break # get current positions of four trackbars r = cv2.getTrackbarPos('R','image') g = cv2.getTrackbarPos('G','image') b = cv2.getTrackbarPos('B','image') s = cv2.getTrackbarPos(switch,'image') if s == 0: img[:] = 0 else: img[:] = [b,g,r] cv2.destroyAllWindows

OpenCV ペイントツールとしてのマウス

マウスクリックすると円を書くサンプル import cv2 import numpy as np # mouse callback function def draw_circle(event,x,y,flags,param): if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),100,(255,0,0),-1) # Create a black image, a window and bind the function to window img = np.zeros((512,512,3), np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle) while(1): cv2.imshow('image',img) if cv2.waitKey(20) & 0xFF == 27: break cv2.destroyAllWindows() マウスで選択した長方形を塗りつぶすサンプル import cv2 import numpy as np drawing = False # true if mouse is pressed mode = True # if True, draw rectangle. Press 'm' to toggle to curve ix,iy = -1,-1 # mouse callback function def draw_circle(event,x,y,flags,param): global ix,iy,drawing,mode if event == cv2.EVENT_LBUTTONDOWN: drawing = True ix,iy = x,y elif event == cv2.EVENT_MOUSEMOVE: if drawing == True: if mode == True:

OpenCV-Python 基本的な操作

基本的な操作を色々試してみた import numpy as np import cv2 import datetime import math img = cv2.imread("dsub.jpg") maxX = img.shape[0] maxY = img.shape[1] colorNo = img.shape[2] dataSize = img.size dataType = img.dtype print("MaxX:" + str(maxX) + " MaxY:" + str(maxY) + " Color:" + str(colorNo) + " Size:" + str(dataSize) + " Data Type:" + str(dataType)) print(len(img[0])) #=480 print(len(img)) #640 # #[[480],[480],...,[480]] #<------ 640-----------> # #[0,0,0]=black #[255,255,255] = white #[255,0,0] = blue #[0,255,0] = green #[0,0,255] = red #コピーは参照渡しになる #img2.item(x,y,0) 読み出し 3項目は色 #img2.itemset((x,y,0),value) 書込み img2 = img for x in range(int(maxX/2)): for y in range(int(maxY/2)): #img2[x,y] = [x % 256,y % 256,x % 256] #img2.itemset((x,y,0),img2.item(x,y,0) /5) img2.itemset((x,y,0),math.sqrt(x*x+y*y) % 256) #画像中の注目領域(ROI) ball = img[280:340, 330:390] img[273:333, 100:160] = ball #色の分解 b,g,r =

OpenCVの描画機能

OpenCVの描画機能 こちらを動かしてみた。 import numpy as np import cv2 # Create a black image img = np.zeros((512,512,3), np.uint8) # Draw a diagonal blue line with thickness of 5 px img = cv2.line(img,(0,0),(511,511),(255,0,0),5) img = cv2.rectangle(img,(384,0),(510,128),(0,255,0),3) img = cv2.circle(img,(447,63), 63, (0,0,255), -1) img = cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1) pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32) pts = pts.reshape((-1,1,2)) img = cv2.polylines(img,[pts],True,(0,255,255)) font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows()

複数のWORDを一括置換

複数のWord文書に対して文字列置換 こちらのサイトのマクロを使ってみた WORDにマクロとして登録したら動いた Sub 複数文書連続処理_文字列置換() '置換文字列の指定 mae = InputBox("置換前の文字列を入力してください。", "置換前") If mae = "" Then Exit Sub ato = InputBox("置換後の文字列を入力してください。", "置換後") If ato = "" Then Exit Sub 'フォルダの選択 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "フォルダを選択" .AllowMultiSelect = False If .Show = -1 Then mypath = .SelectedItems(1) & "\" Else MsgBox "終了します。" Exit Sub End If End With '実行 res = MsgBox(mypath & "のフォルダ内のWord文書について「" & mae & "」を「" & ato & "」に置換します。よろしいですか。", vbOKCancel) If res = vbCancel Then Exit Sub myfile = Dir(mypath & "*.doc*") Do While myfile <> "" Documents.Open FileName:=mypath & myfile Ca

PythonでWEBカメラで動画を撮影し保存

動画を扱う こちらのサンプルを動かしてみた。 cv2.flip(frame,0)で画像を反転しているみたい。 import numpy as np import cv2 cap = cv2.VideoCapture(0) # Define the codec and create VideoWriter object fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) while(cap.isOpened()): ret, frame = cap.read() if ret==True: #frame = cv2.flip(frame,0) # write the flipped frame out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # Release everything if job is finished cap.release() out.release() cv2.destroyAllWindows()

PythonでWebカメラで撮った画像を保存

これを使うと、製品出荷時のエビデンスとして画像記録を保存する場合などに使えそう。 以下でタイムスタンプ付きで画像を保存する。 import numpy as np import cv2 import datetime cap = cv2.VideoCapture(0) print("width:" + str(cap.get(3)) + " height:" + str(cap.get(4)) ) # Capture frame-by-frame ret, frame = cap.read() ## Our operations on the frame come here #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Display the resulting frame cv2.imshow('frame',gray) cv2.imwrite("img" + datetime.datetime.now().strftime('%Y%m%d%H%M%S')+'.png',frame) #画像を保存 # When everything done, release the capture cap.release() cv2.destroyAllWindows()

PythonでWEBカメラからの画像取り込み

動画を扱う こちらを参照した。 import numpy as np import cv2 cap = cv2.VideoCapture(0) while(True): # Capture frame-by-frame ret, frame = cap.read() # Our operations on the frame come here gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Display the resulting frame cv2.imshow('frame',gray) if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything done, release the capture cap.release() cv2.destroyAllWindows()

OpenCV-Pythonチュートリアル 画像の読み込み,表示,保存方法

OpenCV-Pythonチュートリアル をやってみる import numpy as np import cv2 #画像ファイル読込 #cv2.IMREAD_COLOR : カラー画像として読み込む.画像の透明度は無視される.デフォルト値 #cv2.IMREAD_GRAYSCALE : グレースケール画像として読み込む #cv2.IMREAD_UNCHANGED : アルファチャンネルも含めた画像として読み込む # Load an color image in grayscale img = cv2.imread('dsub.jpg',cv2.IMREAD_COLOR) cv2.imshow('image',img) #画像表示 (タイトル,データ) cv2.namedWindow('image', cv2.WINDOW_NORMAL) #サイズ可変 cv2.imshow('image',img) k = cv2.waitKey(0) #キー入力待ち 引数は待ち時間(ms) 0で無限 if k == 27: # wait for ESC key to exit cv2.destroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv2.imwrite('messigray.png',img) #画像を保存 cv2.destroyAllWindows() #全ウインドウ クローズ Matplotlibを使用 まずmatplotlibを入れる pip install matplotlib 読み込んだ画像のズームや移動、保存ができる # # Matplotlibを使えば,画像のズームや保存ができます # need pip install matplotlib # OpenCVで読み込んだカラー画像はBGRモードで読み込まれます. # しかし, Matplotlib は画像をRGBモードで表示します. # そのため,OpenCVを使って読み込んだ

PythonでWebカメラの画像を取り込む

Python+OpenCVでWebカメラの画像を取り込んで処理して表示する話 こちらのサイトを参考にした。 opencvをインストールする pip install opencv-python リンク先の以下のコードを実行 うまいことWEBカメラの画像が取り込めた。画像認識やバーコード読込に使ってみたい。 # OpenCV のインポート import cv2 # VideoCaptureのインスタンスを作成する。 # 引数でカメラを選べれる。 cap = cv2.VideoCapture(0) while True: # VideoCaptureから1フレーム読み込む ret, frame = cap.read() # スクリーンショットを撮りたい関係で1/4サイズに縮小 frame = cv2.resize(frame, (int(frame.shape[1]/4), int(frame.shape[0]/4))) # 加工なし画像を表示する cv2.imshow('Raw Frame', frame) # 何か処理(ここでは文字列「hogehoge」を表示する) edframe = frame cv2.putText(edframe, 'hogehoge', (0,50), cv2.FONT_HERSHEY_PLAIN, 3, (0, 255,0), 3, cv2.LINE_AA) # 加工済の画像を表示する cv2.imshow('Edited Frame', edframe) # キー入力を1ms待って、k が27(ESC)だったらBreakする k = cv2.waitKey(1) if k == 27: break # キャプチャをリリースして、ウィンドウをすべて閉じる cap.release() cv2.destroyAllWindows()

オンラインで PDF のサイズを縮小

オンラインで PDF のサイズを縮小 16MバイトのPDFファイルがメールに添付できず困っていたところ、このサイトを見つけた。 ブラウザへドロップするだけで、1Mバイトまで圧縮された。助かった。

19インチラック

デジタルマルチメーターなどの工場で使う計測器の横幅は19インチ (in)(482.6ミリメートル (mm))またはその半分(241mm)であることが多い 19インチラック

【ミスミ】アルミフレーム設計支援ソフト MISUMI FRAMES

イメージ
【ミスミ】アルミフレーム設計支援ソフト MISUMI FRAMES という新サービスが始まるようだ アルミフレーム設計支援ソフト MISUMI FRAMES これまでも ミスミのWEB設計ボックス を利用してWEB上でアルミケースの穴開け加工を設計・注文して納品してもらっているので、どのようなサービスが始まるのか楽しみである。 ダウンロードして動かしてみた。 とても面白い。 価格がリアルタイムで出てくるので、いくらくらいかかるのかわかって良い。 結合部品も自動で追加されて便利。 斜め構造が作れないのが残念だが、色々応用できそうである。 No.000010 高さ可変フィルム圧着治具 こんなのが作れたら楽しいだろうな

Pythonからaccessのmdbファイルを操作したいが上手く動かない

うまく動かない。 恐らく64bit版と32bit版のドライバ(ADOかODBCか)が競合しているのだろう。VBSなら32,64bitでWscriptを切り替えて使えるのだが。 OSがWindows10で64bitでOffice2013が32bitドライバなのだろう。 Win32OLE 活用法 【第 7 回】 ほかの言語での COM るびまにPythonからcomオブジェクトを操作する例が載っていたので使えないか考えてみる。 import win32com.client from win32com.server import util import pythoncom class WebBrowserEvent: def OnDownloadComplete(self,*args,**kwds): (print "Download Complete") def OnQuit(self,*args,**kwds): exit def com_collection_iter(collection): return (collection.Item(index) for index in range(1, collection.Count+1)) #ie = win32com.client.Dispatch("InternetExplorer.Application") ie = win32com.client.DispatchWithEvents("InternetExplorer.Application",WebBrowserEvent) ie.Visible = True ie.GoHome() while ie.ReadyState != win32com.client.constants.READYSTATE_COMPLETE: pass ie.Navigate('http://www.ruby-lang.org/') while ie.ReadyState != win32com.client.constants.READYSTATE_COMPLETE:

Pythonでシリアル(RS232C)通信

Pythonでシリアル通信(RS232C)通信をして、Arduinoマイコンのテストコマンドを制御してみました。 【準備】pipでpyserialのインストールが必要です。 pip install pyserial #!/usr/bin/python3 """ Python RS232C ***need pyserial module*** pip install pyserial Python3 OS:Windows or Linux DATE VER NAME COMMENT 2020/03/02 0.00 garyo NEW """ import serial import time import datetime class PyRs232c(): VERSION = "0.00" logFilename = "SIO.log" def __init__(self): self.baudrate = 9600 self.com_name = "COM1" #self.com_name = '/dev/ttyUSB0' self.timeout = 1.0 def setComName(self,com_name): self.com_name = com_name def setBaudrate(self,baudrate): self.baudrate = baudrate def sioOpen(self,com_name="",baudrate = 0): if com_name != "" : self.com_name = com_name if baudrate != 0: self.baudrate = baudrate self.s

Pythonで再帰的にファイルを探し、ファイルのタイムスタンプを得る

大量にあるファイル・フォルダの中から「count.dat」というファイルのタイムスタンプを調べて、どのフォルダのソフトが稼働中なのか調べたかった。Dosのコマンドでできるかと思ったができなさそうなので、書いた #!/usr/bin/python3 """ Python tools Python3 OS:Windows or Linux DATE VER NAME COMMENT 2020/02/06 0.00 garyo NEW """ import tkinter as tk from tkinter import messagebox import tkinter.simpledialog as sim import datetime import os import glob import subprocess from tkinter import filedialog as tkFileDialog import time class PyTool(): VERSION = "0.00" logFilename = "log.csv" #def __init__(self): def addRoot(self): self.root = tk.Tk() self.root.withdraw() def setRoot(self,root): self.root = root #I/O def inputBox(self,msg): tmp = sim.askstring("Input Box",msg,initialvalue = "") return tmp def messageBox(self,msg): messagebox.showinfo("message",msg) #Log def setLogFilename(self,f

Pythonでよく使うツール自分まとめ

Pythonでよく使うツールを自分用に集めている #!/usr/bin/python3 """ Python tools Python3 OS:Windows or Linux [add submodule] git submodule add https://github.com/garyohosu/PyTool.git git commit -m "add submodule: hello" [update] git submodule foreach git pull [import] from PyTool.PyTool import PyTool DATE VER NAME COMMENT 2020/02/06 0.00 garyo NEW """ import tkinter as tk from tkinter import messagebox import tkinter.simpledialog as sim import datetime import os import glob import subprocess from tkinter import filedialog as tkFileDialog import time class PyTool(): VERSION = "0.00" logFilename = "" #def __init__(self): def addRoot(self): self.root = tk.Tk() self.root.withdraw() def setRoot(self,root): self.root = root #I/O def inputBox(self,msg): tmp = sim.askstring("Input Box",msg,initialvalue = "") retu

Pythonでtkinterを使用した簡単なGUIアプリ

Pythonのtkinterを使ったGUIサンプル これを何も見ずかけるように頭の体操として書いている import tkinter as tk from tkinter import messagebox def btn_clicked(): messagebox.showinfo("name",txt1.get()) root = tk.Tk() root.title("test") root.geometry("400x200") lbl1 = tk.Label(root,text = "NAME") lbl1.pack(side = "left") txt1 = tk.Entry(root,width =20) txt1.pack(side = "left") btn1 = tk.Button(root,text = "PUSH",command = btn_clicked) btn1.pack(side = "left") root.mainloop()