OpenCV4Androidコードをマルチスレッド化しようとしています。432x432の画像を9つの144x144セグメントに分割し、それぞれを異なるスレッドに渡します。
Thread[] threads = new Thread[9];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
threads[3*i+j] = new Thread(new MyThread(image.rowRange(144*i, 144*(i+1)).colRange(144*j, 144*(j+1))));
threads[3*i+j].start();
}
}
for (Thread thread : threads) try {thread.join();} catch (InterruptedException e) {};
スレッドクラスは次のとおりです。
public class MyThread implements Runnable {
final Mat block;
public MyThread(Mat block) {
this.block = block;
}
public void run() {
/* do image processing on block */
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat();
Imgproc.morphologyEx(block, closed, Imgproc.MORPH_CLOSE, kernel);
Core.divide(block, closed, block, 1, CvType.CV_32F);
Core.normalize(block, block, 0, 255, Core.NORM_MINMAX);
block.convertTo(block, CvType.CV_8UC1);
Imgproc.threshold(block, block, -1, 255, Imgproc.THRESH_BINARY_INV+Imgproc.THRESH_OTSU);
}
}
私には2つの問題があります:
スレッドは個々のブロックを正しく変更していますが、変更は最終的な画像に表示されていません。これは、値によってスレッドに渡された場合は意味
Mat block
がありますが、Javaは代わりにスレッドへの参照を渡す必要があります。ランタイムはスレッド化されていないコードよりも長くなります。私のエミュレーターでは、1200ミリ秒から1500ミリ秒になります。これはエミュレーターの問題ですか、それともマルチスレッド化は何らかの理由でここで本当に悪い考えですか?