Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV掩蔽错误结果撕裂_Opencv_Image Processing_Javacv - Fatal编程技术网

OpenCV掩蔽错误结果撕裂

OpenCV掩蔽错误结果撕裂,opencv,image-processing,javacv,Opencv,Image Processing,Javacv,我试图将二值图像遮罩到原始图像上,大多数情况下它都能正常工作,但我偶尔会发现: 关于为什么会发生这种情况以及如何解决它,有什么想法吗?提前感谢:) 编辑:好的,我有两张图片,我正在寻找它们之间的区别,最后是手 一个好结果的例子 然后,我将差分图像转换为灰度,对图像进行二值化(使用cvThreshold),最后将结果用作输入2上的遮罩(手的原始图像)。最后一次手术cvCopy似乎是导致撕裂的原因,请注意,它只会偶尔发生(大约1/5次) 以下是my Main.java的外观: impo

我试图将二值图像遮罩到原始图像上,大多数情况下它都能正常工作,但我偶尔会发现:

关于为什么会发生这种情况以及如何解决它,有什么想法吗?提前感谢:)

编辑:好的,我有两张图片,我正在寻找它们之间的区别,最后是手

一个好结果的例子

然后,我将差分图像转换为灰度,对图像进行二值化(使用cvThreshold),最后将结果用作输入2上的遮罩(手的原始图像)。最后一次手术cvCopy似乎是导致撕裂的原因,请注意,它只会偶尔发生(大约1/5次)

以下是my 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;

}

它看起来像是通道或格式不匹配。您能给我们一个示例图像和您代码的简化版本吗?@RadfordParker添加了请求的信息,感谢您的回复。@user2041427不清楚您是否暗示错误是不确定的,或者您有五分之一的不同图像给出了不正确的结果。如果是后者,则包括两张显示问题的图像。免责声明:我从未查看过您的代码。抱歉,如果我不清楚的话,我的意思是错误是不确定的,它似乎是随机发生的,但经常发生,因此我猜它大约每5次程序运行就会发生一次。@user2041427我不确定您是否完全理解我的注释。您是否声称给定两个图像(并且始终是相同的两个图像),程序有时会给出正确的结果,有时则不会/或者,是某两个图像的组合给出了不正确的结果吗?