ミムの部屋

社内SEが,興味をもったことを書いていきます.

opencv でカメラビューに円を検知する(opencv,androidアプリ,カメラビュー)

opencvを用いて,カメラビューで円を検知し描画するソースコードを載せます.
とりあえず,下の感じです.
説明は適宜追加する可能性があります.

opencvの主処理

//android関連
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

//opencv関連
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.Point;


/**
 * Created by あああああ on 2017/07/02.
 */
public class CameraActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener{
    // カメラビューのインスタンス
	// CameraBridgeViewBase は JavaCameraView/NativeCameraView のスーパークラス
	private CameraBridgeViewBase mCameraView;

    // ライブラリ初期化完了後に呼ばれるコールバック (onManagerConnected)
    // public abstract class BaseLoaderCallback implements LoaderCallbackInterface
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                // 読み込みが成功したらカメラプレビューを開始
                case LoaderCallbackInterface.SUCCESS:
                    mCameraView.enableView();
                    break;
                default:
                    super.onManagerConnected(status);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        Log.d("camera","onCreate");
        // カメラビューのインスタンスを変数にバインド
        mCameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view);
        // リスナーの設定 (後述)
        mCameraView.setCvCameraViewListener(this);

    }

    @Override
    protected void onResume() {
        super.onResume();
        // 非同期でライブラリの読み込み/初期化を行う
        // static boolean initAsync(String Version, Context AppContext, LoaderCallbackInterface Callback)
        if (!OpenCVLoader.initDebug()) {
            Log.d("onResume", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
        } else {
            Log.d("onResume", "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);

        }
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        // カメラプレビュー開始時に呼ばれる
        Log.d("camera","viewstart");
    }
    @Override
    public void onCameraViewStopped() {
        // カメラプレビュー終了時に呼ばれる
    }

    // CvCameraViewListener の場合
    // フレームをキャプチャする毎(30fpsなら毎秒30回)に呼ばれる
    @Override
    public Mat onCameraFrame(Mat inputFrame) {
        // 円を検出する部分
        Mat gray = new Mat(inputFrame.rows(), inputFrame.cols(), CvType.CV_8SC1);
        Imgproc.cvtColor(inputFrame, gray, Imgproc.COLOR_RGB2GRAY);
        Mat circles = new Mat();// 検出した円の情報格納する変数
        Imgproc.HoughCircles(gray, circles, Imgproc.CV_HOUGH_GRADIENT, 2, 10, 160, 50, 10, 20);

        Point pt = new Point();
        // 検出した直線上を緑線で塗る
        for (int i = 0; i < circles.cols(); i++){
            double data[] = circles.get(0, i);
            pt.x = data[0];
            pt.y = data[1];
            double rho = data[2];
            Imgproc.circle(inputFrame, pt, (int)rho, new Scalar(0, 200, 0), 5);
        }
        Log.d("onCamera", "1");

        return inputFrame;
    }

    // CvCameraViewListener2 の場合
//    @Override
//    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
//        Mat circles = new Mat();
//        Mat gray = new Mat();
//        Imgproc.cvtColor(inputFrame,gray,Imgproc.COLOR_RGB2GRAY);
//        Imgproc.HoughCircles(gray,circles,Imgproc.CV_HOUGH_GRADIENT,2,10,160,50,10,20);
//        return inputFrame;
//    }
    public interface CvCameraViewFrame {
        // 1チャンネルグレースケールのMatインスタンスを返す
        public Mat gray();
    }
}

AndroidMainfeset.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exampl.あああああああ">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Library.LibraryActivity"
            android:label="@string/library_images"
            >

        </activity>
        <activity
            android:name=".Camera.CameraActivity"
            android:label="@string/library_images"
            android:screenOrientation="landscape">

        </activity>
    </application>

    <!--権限設定-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA"/>

    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
</manifest>

カメラビューのlayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:opencv="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.あああああああ.Camera.CameraActivity">

    <org.opencv.android.JavaCameraView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:visibility="visible"
        android:id="@+id/camera_view"
        opencv:show_fps="true"
        opencv:camera_id="any" />

</RelativeLayout>

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.example.ああああああ"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile project(':openCVLibrary320')
}

Apache POIでパワポスライドにオブジェクトを追加(JAVA, Apache POI, PowerPoint)

久しぶりに投稿します.
なんか,パワポJavaから作成できないか調べていたら,Apache POIなるものがあったので,使ってみることにしました.

早速ですが,題名の要件を満たしたコードをのっけます

import java.awt.Rectangle;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hslf.usermodel.HSLFAutoShape;
import org.apache.poi.hslf.usermodel.HSLFShape;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.sl.usermodel.*;


public class POItest {
	public static void main(String[] args) {
	  
              HSLFSlideShow pptt = new HSLFSlideShow();
	    
	      //creating an FileOutputStream object
	      File file =new File("example1.pptx");
	      FileOutputStream out;
	      
		try {
			HSLFSlide sl = pptt.createSlide();			
			out = new FileOutputStream(file);
			HSLFShape shape = new HSLFAutoShape(ShapeType.RECT);
		        shape.setAnchor(new Rectangle(50,100,100,100));
		        sl.addShape(shape);
		    
		      //saving the changes to a file
		      pptt.write(out);
		      System.out.println("Presentation created successfully");
		      out.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	  }
}

結果は,以下の通りです.
f:id:mimuishigaki:20170708175305p:plain

Android studioでgsonを使う

[Android studio][gson]

はじめて,はてなブログでブログを更新します.
今回の目的としては,gsonとはてなブログの記法に慣れるために書きます.
そのため,ちょっと見にくいこともあると思いますがご勘弁を.

  • Gson.javaのコード
import com.google.gson.Gson;

public class Gson {
private Gson gson = new Gson();
private TestModel  testModel = new TestModel();

public void test(){
testModel = gson.fromJson("JSONデータ", TestModel.class);
}
  • TestModelのコード
import java.util.ArrayList;
import java.util.List;

public class TestModel {
    public int total_count;
    public int offset;
    public int limit;
    public List<String> result;

    public TestModel(int total_count, int offset, int limit){
        this.total_count = total_count;
        this.offset = offset;
        this.limit = limit;
        this.result = new ArrayList<String>();
    }
}

TestModelでは,あらかじめJSONデータにおける"キー"と"値"のペアを確認して構築しました.
たとえば,今回私が対象にしてたデータには{total_count, offset, limit, result}があったため,メンバ変数を同じ名前にしました.


そして,Gson.javaでは,gsonのメソッドであるfromJson()を用いて,JSONデータをTestModelオブジェクトに入れることできました.
TestModelのtestModelからJSONデータの"値"を取り出すこと容易にできました.

指定ユーザのタイムラインのツイートを取得

今回は指定ユーザのタイムラインのツイートを取得するソースコードを書きます.

import twitter4j.Paging;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.api.TimelinesResources;
import twitter4j.auth.AccessToken;



public class Print {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String consumerKey = "自分のconsumerKey";
		String consumerSecret = "自分のconsumerSecret";
		String accessToken = "自分のaccessToken";
		String accessTokenSecret = "自分のaccessTokenSecret";
		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(consumerKey, consumerSecret);
                
                twitter.setOAuthAccessToken(new AccessToken(accessToken, accessTokenSecret));
		
    	try {
  
    		TimelinesResources timeline = twitter.timelines();
    		
    		Paging paging = new Paging();// Pagingオブジェクトを作成
    		paging.setPage(1);// ページ番号を指定
    		paging.count(200);// 1ページから取得するツイート数を指定
//    		paging.setMaxId(ツイートのID);// MaxIdよりも後のツイートを取得するよう指定
//    	        paging.setSinceId(sinceId);// SinceIdよりも前のツイートを取得するよう指定

    		ResponseList tweets = timeline.getUserTimeline("指定ユーザ名", paging);
		        
    	    for(Status tweet: tweets){
    	    	System.out.println("tweet:" + tweet);
    	    }
		} catch (TwitterException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}        
	}
}

TwitterAPI制限の残量を取得(Twitter4j,TwitterAPI制限)

今回は,TwitterAPI制限の残量を取得するためのソースコードを書きます.
import java.util.HashMap;
import java.util.Map;

import twitter4j.RateLimitStatus;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.api.FriendsFollowersResources;
import twitter4j.auth.AccessToken;



public class Print {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String consumerKey = "自分のconsumerKey";
		String consumerSecret = "自分のconsumerSecret";
		String accessToken = "自分のaccessToken";
		String accessTokenSecret = "自分のaccessTokenSecret";
		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(consumerKey, consumerSecret);
        twitter.setOAuthAccessToken(new AccessToken(accessToken, accessTokenSecret));
		
        Map helpmap = new HashMap();// API制限情報を格納変数を作成       
    	try {
			helpmap = twitter.help().getRateLimitStatus();

			
		        for(Map.Entry e : helpmap.entrySet()){
		        	/*
		        	 * 対象API制限項目
		        	 * 1:e.getKey().equals("/statuses/show/:id") ||
		        	 * 2:e.getKey().equals("/application/rate_limit_status") ||
		        	 * 3:e.getKey().equals("/users/lookup")
		        	 */
		    		if(e.getKey().equals("/application/rate_limit_status") || 
		    		   e.getKey().equals("/statuses/retweeters/ids") ||
		    		   e.getKey().equals("/search/tweets") ||
		    		   e.getKey().equals("/friendships/show")){
		    			System.out.println(e.getKey() + "\nremain: " + e.getValue().getRemaining());
		    		}
//	    			System.out.println(e.getKey() + "\nremain: " + e.getValue().getRemaining());
                   
		        }
		        
		} catch (TwitterException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}        
	}
}

任意のユーザのフォロー関係を取得(Twitter4j)

今回は,任意の二つのユーザのフォロー関係を取得するためのソースコードを書きます.
import java.util.HashMap;
import java.util.Map;

import twitter4j.RateLimitStatus;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.api.FriendsFollowersResources;
import twitter4j.auth.AccessToken;



public class Print {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String consumerKey = "自分のconsumerKey";
		String consumerSecret = "自分のconsumerSecret";
		String accessToken = "自分のaccesToken";
		String accessTokenSecret = "自分のaccessTokenSecret";
		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(consumerKey, consumerSecret);
        twitter.setOAuthAccessToken(new AccessToken(accessToken, accessTokenSecret));
		       
    	try {
			
			 FriendsFollowersResources friendship = twitter.friendsFollowers();
                        // 指定ユーザA,指定ユーザB
                        System.out.println("friendships:\n" + friendship.showFriendship("指定ユーザAのアカウント名", "指定ユーザBのアカウント名"));
             
		} catch (TwitterException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}        
	}
}

Neo4jをインストールしてみる(グラフDB,Neo4j,Mac)

今回はグラフDBの一つであるNeo4jをインストールしてみました!!

Neo4jのインストール

neo4jはここから自分にあったファイルをダウンロードしてください.
tar -xf neo4j-community-2.3.1-unix.tar.gz
cd 解凍ファイル名/bin/
./neo4j start
インストールし終わったら,ブラウザのアドレスバーに「http://localhost:7474」を代入してログインしてください. 初期ユーザ名とパスワードは,「neo4j」です.

Neo4jを使ってみる

デモデータが用意されてみるようなので,試しに下のように使ってみる.
LOAD CSV WITH HEADERS FROM "http://neo4j.com/docs/2.2.0-M04/csv/query-tuning/movies.csv" AS line
MERGE (m:Movie { title:line.title })
ON CREATE SET m.released = toInt(line.released), m.tagline = line.tagline
ただエラーが出てくる....
じゃあ,デモデータをファイルを直にダウンロードしてやってみることにした.
なのでファイルを以下のURLからダウンロードした. ダウンロードしたら,下のように絶対パスを指定してファイルをインポートしてみる.
#データのインポート開始
#映画情報
LOAD CSV WITH HEADERS FROM "file:///絶対パス/movies.csv" AS line
MERGE (m:Movie { title:line.title })
ON CREATE SET m.released = toInt(line.released), m.tagline = line.tagline

#俳優情報
LOAD CSV WITH HEADERS FROM "file:///絶対パス/actors.csv" AS line
MATCH (m:Movie { title:line.title })
MERGE (p:Person { name:line.name })
ON CREATE SET p.born = toInt(line.born)
MERGE (p)-[:ACTED_IN { roles:split(line.roles,";")}]->(m)

#監督情報
LOAD CSV WITH HEADERS FROM "file:///絶対パス/directors.csv" AS line
MATCH (m:Movie { title:line.title })
MERGE (p:Person { name:line.name })
ON CREATE SET p.born = toInt(line.born)
#データのインポート終了

#描画してみる
MATCH (actor:Person { name: "Keanu Reeves" })-[r:ACTED_IN]->(movie) 
RETURN actor,movie 
上のようにドンドンやると下のようになった( ´ ▽ ` )ノ
neo4jEx01.png
よかった!!!

追記

ログアウトの方法が分からなかったので,調べてみました. コマンドラインに「:server disconnect」を入力するとできるそうです.

参考サイト