java – 从一个Mat复制到另一个Mat只有近乎黑色的像素
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 从一个Mat复制到另一个Mat只有近乎黑色的像素,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4578字,纯文字阅读大概需要7分钟。
内容图文
![java – 从一个Mat复制到另一个Mat只有近乎黑色的像素](/upload/InfoBanner/zyjiaocheng/800/43f999a0c43e415d81ab3d2fbdf62ed5.jpg)
我有Mat差异,其中有一些黑色像素(或者实际上几乎是黑色像素 – 如果发生地震,还有移动等等),以及包含自然色彩的真实图像的Mat电流.我想将Mat电流中的像素替换为Mat差异中的这些黑色像素.如果我像这样手动执行:
for(int i = 0; i < difference.rows(); i++){
for(int j = 0; j < difference.cols(); j++){
subtractedPixel = difference.get(i, j);
if(subtractedPixel[0] < 10 && subtractedPixel[1] < 10 && subtractedPixel[2] < 10){
originalPixel = current.get(i, j);
difference.put(i, j, originalPixel);
}
}
它非常慢.
完整代码(运行):
package com.example.szpieg2;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Range;
import org.opencv.core.Size;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;
public class TrackActivity extends Activity implements CvCameraViewListener {
private Mat current;
private CameraBridgeViewBase cameraView;
private Mat previous;
private Mat difference;//difference between previous and current
private boolean first = true;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i("Co sie dzieje?", "OpenCV loaded successfully");
cameraView.enableView();
// cameraView.setOnTouchListener(ColorBlobDetectionActivity.this);
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_track);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
cameraView = (CameraBridgeViewBase) findViewById(R.id.surface_view);
cameraView.setCvCameraViewListener(this);
}
// --------Activity Actions---------
@Override
public void onPause() {
if (cameraView != null)
cameraView.disableView();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this,
mLoaderCallback);
}
public void onDestroy() {
super.onDestroy();
if (cameraView != null)
cameraView.disableView();
}
// --------/Activity Actions/---------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_track, menu);
return true;
}
// --------listener method implementation-------------
@Override
public void onCameraViewStarted(int width, int height) {
/*current = new Mat(width, height, CvType.CV_64FC4);
previous = new Mat(width, height, CvType.CV_64FC4);
difference = new Mat(width, height, CvType.CV_64FC4);*/
current = new Mat(width, height, CvType.CV_8UC4);
previous = new Mat(width, height, CvType.CV_8UC4);
difference = new Mat(width, height, CvType.CV_8UC4);//RGBA 0..255
}
@Override
public void onCameraViewStopped() {
current.release();
}
@Override
public Mat onCameraFrame(Mat inputFrame) {
inputFrame.copyTo(current);
if(first){//first is true at the first time
inputFrame.copyTo(previous);
first = false;
Log.i("First processing", "Pierwszy przebieg");
}
Core.absdiff(current, previous, difference);
// Core.absdiff( previous,current, difference);
//I leave black pixels and load original colors
double[] subtractedPixel, originalPixel;
String s = "";
for(int i = 0; i < difference.rows(); i++){
for(int j = 0; j < difference.cols(); j++){
subtractedPixel = difference.get(i, j);
if(subtractedPixel[0] < 10 && subtractedPixel[1] < 10 && subtractedPixel[2] < 10){
originalPixel = previous.get(i, j);
difference.put(i, j, originalPixel);
}
}
// s+="\n";
}
// Log.i("mat ", s);
// Log.i("mat ", difference.get(44,444)[0] + "");
//---------------------------------------------
inputFrame.copyTo(previous);
return difference;//UNREAL COLORS
}
}
解决方法:
您可以执行以下操作.
>使用inRange()阈值图像.
Mat mask;
void inRange(difference, Scalar(0,0,0), Scalar(9,9,9), mask)
输出掩码将是一个二进制掩码,如果其低于阈值cv :: Scalar(9,9,9),则其像素设置为255;
>使用copyTo()通过掩码将差异图像复制到当前图像.
difference.copyTo(current, mask);
内容总结
以上是互联网集市为您收集整理的java – 从一个Mat复制到另一个Mat只有近乎黑色的像素全部内容,希望文章能够帮你解决java – 从一个Mat复制到另一个Mat只有近乎黑色的像素所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。