简体   繁体   English

JavaCV cvInRangeS错误

[英]JavaCV cvInRangeS Error

I'm trying to filter out the contours in an image. 我正在尝试过滤掉图像中的轮廓。 My code has no syntax errors but I just get a lot of red text when I run my program. 我的代码没有语法错误,但是我在运行程序时只得到很多红色文本。 I have located the point of failure to be cvInRangeS. 我确定了失败的要点是cvInRangeS。

cvInRangeS(imghsv,minc,maxc,imgbin);

You can see this with the println statments only making it to "thourgh3" 您可以通过println语句看到它,仅使其变为“ thourgh3”

square.jpg is in the project directory so that shouldn't be the problem if that helps. square.jpg在项目目录中,因此如果有帮助,就不应该成为问题。

The console returnes 控制台返回

Through 1
Through 2
Through 3 
OpenCV Error: Assertion failed (src1.size == dst.size && dst.type() == CV_8U) in     cvInRangeS, file ..\..\..\..\opencv\modules\core\src\arithm.cpp, line 2972
Exception in thread "main" java.lang.RuntimeException: ..\..\..\..\opencv\modules\core\src\arithm.cpp:2972: error: (-215) src1.size == dst.size && dst.type() == CV_8U in function cvInRangeS

at com.googlecode.javacv.cpp.opencv_core.cvInRangeS(Native Method)
at opencv2.OpenCV2.main(OpenCV2.java:50)
Java Result: 1

The full code is as follows 完整的代码如下

package opencv2; 


/*There are import statments here but for the sake of space I have left them out :D*/

public class OpenCV2 {
    public static void main(String[] args) {

        IplImage img1;
        IplImage imghsv;
        IplImage imgbin;
        CvScalar minc = cvScalar(95,150,75,0), maxc = cvScalar(145,255,255,0);
        CvSeq contour1 = new CvSeq(), contour2;
        CvMemStorage storage = CvMemStorage.create();
        double areaMax = 1000, areaC = 0;

        System.out.println("Through 1");

        img1 = cvLoadImage("square.jpg");
        imghsv = cvCreateImage(cvGetSize(img1),8,3);
        imgbin = cvCreateImage(cvGetSize(img1),8,3);
                    System.out.println("Through 2");

        cvCvtColor(img1,imghsv,CV_BGR2HSV);
                    System.out.println("Through 3");

        cvInRangeS(imghsv,minc,maxc,imgbin);
                    System.out.println("Through 4");

        cvFindContours(imgbin,storage,contour1,Loader.sizeof(CvContour.class),
                CV_RETR_LIST, CV_LINK_RUNS,cvPoint(0,0));

        contour2 = contour1;

                    System.out.println("Through 5");

        while(contour1 != null && !contour1.isNull()){
        areaC = cvContourArea(contour1,CV_WHOLE_SEQ,1);

        if(areaC > areaMax){
        areaMax  = areaC;
        }

        contour1 = contour1.h_next();
        }//end of while

        while(contour2 != null && !contour2.isNull()){
        areaC = cvContourArea(contour2,CV_WHOLE_SEQ,1);

                    System.out.println("Through 6");

        if(areaC < areaMax){
        cvDrawContours(imgbin,contour2,CV_RGB(0,0,0),CV_RGB(0,0,0),
                0,CV_FILLED,8,cvPoint(0,0));
            }//end of if

                    System.out.println("Through 7");
        contour2 = contour2.h_next();
        }//end of while2

                    System.out.println("Through 8");
        cvShowImage("Color",img1);
        cvShowImage("CF",img1);
        cvWaitKey();

        cvReleaseImage(img1);
        cvReleaseImage(imghsv);
        cvReleaseImage(imgbin);
        cvReleaseMemStorage(storage);

    }//end of main
}//end of class

cvInRangeS() assumes the type of the input image to be CV_8U , so you have to convert it first. cvInRangeS()假定输入图像的类型为CV_8U ,因此您必须先对其进行转换。

...
cvtColor(imghsv, grayscale, CV_BGR2GRAY ); 
cvInRangeS(grayscale,minc,maxc,imgbin);
...

Thanks for your help. 谢谢你的帮助。 the problem was in this line I have it set to a 3 channel image "3"' imgbin = cvCreateImage(cvGetSize(img1),8,3); 问题是在这一行中,我将其设置为3通道图像“ 3”。imgbin = cvCreateImage(cvGetSize(img1),8,3);

It should be a binary image. 它应该是一个二进制映像。 imgbin = cvCreateImage(cvGetSize(img1),8,1); imgbin = cvCreateImage(cvGetSize(img1),8,1);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM