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(); } } }
結果は,以下の通りです.
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)); Maphelpmap = 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をインストールしてみました!!
じゃあ,デモデータをファイルを直にダウンロードしてやってみることにした.
なのでファイルを以下のURLからダウンロードした.
よかった!!!
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からダウンロードした.
- http://neo4j.com/docs/2.2.0-M04/csv/query-tuning/movies.csv
- http://neo4j.com/docs/2.2.0-M04/csv/query-tuning/actors.csv
- http://neo4j.com/docs/2.2.0-M04/csv/query-tuning/directors.csv
#データのインポート開始 #映画情報 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上のようにドンドンやると下のようになった( ´ ▽ ` )ノ
よかった!!!