バイナリイメージをオリジナルにマスクしようとしていますが、ほとんどの場合は機能しますが、ときどきこれが発生します。
これが起こっている理由とそれを修正する方法についてのアイデアはありますか?前もって感謝します :)
編集:わかりました、それで私は私が違いを見つけている2つの画像を持っています、それは結局手です。
良い結果の例
次に、差分画像をグレースケールに変換し、画像を2値化し(cvThresholdを使用)、最後にその結果をinput2(手付きの元の画像)のマスクとして使用します。最後の操作cvCopyは、このティアリングを引き起こしていると思われる操作です。たまにしか発生しないことに注意してください(およそ1/5回)。
Main.javaは次のようになります。
import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.googlecode.javacv.cpp.opencv_imgproc.CvHistogram;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class Main {
private static CanvasFrame AbsDiffFrame = new CanvasFrame("cvAbsDiff");
private static CanvasFrame SubDiffFrame = new CanvasFrame("cvSub");
private static CanvasFrame grayscale = new CanvasFrame("cvCvtColor CV_RGB2GRAY");
private static CanvasFrame binary = new CanvasFrame("cvThreshold CV_THRESH_BINARY");
private static CanvasFrame hsv = new CanvasFrame("cvCvtColor CV_RGB2HSV");
private static CanvasFrame cvMultiplyAcc = new CanvasFrame("cvMultiplyAcc");
private static CanvasFrame hsv2 = new CanvasFrame("cvCvtColor CV_RGB2HSV");
private static IplImage input1;
private static IplImage input2;
public static void main(String[] args) {
// TODO Auto-generated method stub
AbsDiffFrame.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
SubDiffFrame.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
grayscale.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
binary.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
hsv.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
hsv2.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
cvMultiplyAcc.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
input1 = cvLoadImage("input1.jpg",CV_LOAD_IMAGE_COLOR);
input2 = cvLoadImage("input2.jpg",CV_LOAD_IMAGE_COLOR);
ImageProcessor imgProc = new ImageProcessor();
AbsDiffFrame.showImage(imgProc.getAbsDifference(input1, input2));
IplImage img = imgProc.getSubDifference(input2,input1);
SubDiffFrame.showImage(img);
IplImage hsvImg = imgProc.rgbToHSV(input2);
hsv.showImage(hsvImg);
IplImage gray = imgProc.rgbToGrey(img);
grayscale.showImage(gray);
IplImage binaryImg = imgProc.getBinary(gray);
binary.showImage(binaryImg);
IplImage multiplyImage = imgProc.cvCopyImages(binaryImg, input2);
cvMultiplyAcc.showImage(multiplyImage);
IplImage hsvImg2 = imgProc.rgbToHSV(multiplyImage);
hsv2.showImage(hsvImg2);
CvHistogram hueHistogram = imgProc.getHueHistogram(hsvImg2);
System.out.println("Done");
System.out.printf("max hist value is: ", imgProc.getHistMaxValue(hueHistogram));
}
}
また、cvCopyImageメソッドは次のとおりです。
public static IplImage cvCopyImages (IplImage binary, IplImage color){
IplImage result = cvCreateImage(new CvSize(color.width(),color.height()),color.depth(),3);
cvCopy(color,result,binary);
return result;
}