2

我有以下代码(尝试移植this

    VideoCapture sequence = new VideoCapture(fp + "%02d" + ".jpg");
    if (!sequence.isOpened())
        dbg("Failed to open images!");
    }

    Mat outImg = null;
    Mat curImg = null;
    while (sequence.read(curImg)) {
        Imgproc.accumulateWeighted(curImg, outImg, 0.01);

    }

    imwrite(fp + "median" + "-" + curTime + ".jpg", outImg);

当它到达这一点时,所有图像都在 fp/01.jpg、02.jpg 等中。当它到达 sequence.read(curImg) 行时它会崩溃,所以我不确定出了什么问题,因为它已经检查到确保序列已正确打开。

编辑:更具体地说,我从 Android 调试器得到的错误是

CvException [org.opencv.core.CvException: cv::Exception: /builds/master_pack-android/opencv/modules/imgproc/src/accum.cpp:1108: error: (-215) _src.sameSize(_dst) && dcn == scn in function void cv::accumulateWeighted(cv::InputArray, cv::InputOutputArray, double, cv::InputArray)]

在累积加权方法调用上。

4

2 回答 2

2

熬夜很晚,终于找到了一个可行的解决方案。首先,我的输入图像类型是 CV_8UC1 和 CV_8UC4。所以我需要根据这些规则对我的图像进行颜色转换:

if mat == grayscale == CV_8UC1 then convert to CV_32F
if mat == color == CV_8UC4 then convert to CV_32FC4

示例实现:

private Mat accuImg;
public Mat accumulateImageBG(Mat img, int type){
    if (accuImg==null){//code snipit from berak's answer
        accuImg = Mat.zeros(img.size(), type);
    }
    img.convertTo(img, type);
    Imgproc.accumulateWeighted(img, accuImg, 0.1);
    Core.convertScaleAbs(accuImg, img);
    return img;
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {//new frame from camera
    Mat col = inputFrame.rgba();//in:CV_8UC4 out:CV_32FC4
    Mat gray = inputFrame.gray();//in:CV_8UC1 out:CV_32F

    //be sure to specify conversion type with matching # of channels as input image!
    Mat img = accumulateImageBG(gray,CvType.CV_32F);
    return img;
}
于 2016-05-16T09:43:26.463 回答
1
Mat outImg = null;
Mat curImg = new Mat();
while (sequence.read(curImg)) {
    // you can't pass an empty img to accumulateWeighted()
    if (outImg==null)
        outImg = Mat.zeros(curImg.size(), curImg.type());
    Imgproc.accumulateWeighted(curImg, outImg, 0.01);

}
于 2015-05-20T15:04:14.913 回答