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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/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 JavaCV:使用Camshift算法跟踪对象_Opencv_Tracking_Javacv - Fatal编程技术网

Opencv JavaCV:使用Camshift算法跟踪对象

Opencv JavaCV:使用Camshift算法跟踪对象,opencv,tracking,javacv,Opencv,Tracking,Javacv,我想使用Camshift算法跟踪对象。我试图纠正在原始OpenCV Camshift文件的JavaCV翻译中发现的错误 这是我的密码: package objectTracking; import com.googlecode.javacv.CanvasFrame; import com.googlecode.javacv.FrameGrabber; import com.googlecode.javacv.OpenCVFrameGrabber; import static com.googl

我想使用Camshift算法跟踪对象。我试图纠正在原始OpenCV Camshift文件的JavaCV翻译中发现的错误

这是我的密码:

package objectTracking;

import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.OpenCVFrameGrabber;
import static com.googlecode.javacv.cpp.opencv_core.*;
import com.googlecode.javacv.cpp.opencv_core.CvBox2D;
import com.googlecode.javacv.cpp.opencv_core.CvPoint;
import com.googlecode.javacv.cpp.opencv_core.CvRect;
import com.googlecode.javacv.cpp.opencv_core.CvScalar;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.googlecode.javacv.cpp.opencv_core.IplImageArray;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import com.googlecode.javacv.cpp.opencv_imgproc.CvConnectedComp;
import com.googlecode.javacv.cpp.opencv_imgproc.CvHistogram;
import static com.googlecode.javacv.cpp.opencv_video.*;
import com.sun.jna.ptr.FloatByReference;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class CamShifter implements MouseListener{
final static int MOUSE_PRESSED = 1;
final static int MOUSE_RELEASED = 2;

    IplImage image, frame, hsv, hue, mask, backproject, histimg;
    IplImageArray hueArray;
    CvHistogram hist;
    CanvasFrame histogram = new CanvasFrame("Histogram"), camshiftDemo = new CanvasFrame("CamshiftDemo");

    boolean backproject_mode = false;
    boolean select_object = false;
    int track_object = 0;
    boolean show_hist = true;

    boolean paused = false;

    CvPoint origin = new CvPoint();
    CvRect selection = new CvRect();

    OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
    CvRect track_window = new CvRect();
    CvBox2D track_box = new CvBox2D();

    CvConnectedComp track_comp = new CvConnectedComp();

    int hsize = 16;
    float hranges[] = {0,180};
    int[] hdims = {hsize};
    float hranges_arr[][] = {hranges};

    int vmin = 10, vmax = 256, smin = 30;

    public static void main(String args[]) throws  Exception  {

        CamShifter csh = new CamShifter();
        csh.work(csh);
        System.out.println("CamShiftDetector trial");


    }

    public CamShifter() throws FrameGrabber.Exception {

        grabber.start();
        camshiftDemo.getCanvas().addMouseListener(this);

    }


    public void onMouse(int event, int x, int y) {
        if (select_object) {
            //get selection
            int selX, selY, selW, selH;
            selX = Math.min(x, origin.x());
            selY = Math.min(y, origin.y());
            selW = selX + Math.abs(x - origin.x());
            selH = selY + Math.abs(y - origin.y());
            selection = cvRect(selX, selY, selW, selH);
            System.out.println("Selection : \n("+selX+", "+selY+")\n("+selW+", "+selH+")");

            //ensure that selection is enclosed within the image
            selX = Math.max(selection.x(), 0);
            selY = Math.max(selection.y(), 0);
            selW = Math.min(selection.width(), image.width());
            selH = Math.min(selection.height(), image.height());
            selection = cvRect(selX, selY, selW - selX, selH - selY);
            System.out.println("ensure that selection is enclosed within the image");
            System.out.println("Selection : \n("+selX+", "+selY+")\n("+selW+", "+selH+")");
        }

        switch (event) {
            case MOUSE_PRESSED: 
                origin = cvPoint(x, y);
                selection = cvRect(x, y, 0, 0);
                select_object = true;
                break;
            case MOUSE_RELEASED: 
                select_object = false;
                if (selection.width() > 0 && selection.height() > 0) {
                    track_object = -1;
                }
                break;
        }
    }


    CvScalar hsv2rgb(float hue) {
        int[] rgb = new int[3];
        int p, sector;
        int[][] sector_data = {{0, 2, 1}, {1, 2, 0}, {1, 0, 2}, {2, 0, 1}, {2, 1, 0}, {0, 1, 2}};
        hue *= 0.033333333333333333333333333333333f;
        sector = (int) Math.floor(hue);
        p = Math.round(255 * (hue - sector));
        p = p ^ 1;
        int temp = 0;
        if ((sector & 1) == 1) {
            temp = 255;
        } else {
            temp = 0;
        }
        p ^= temp;

        rgb[sector_data[sector][0]] = 255;
        rgb[sector_data[sector][1]] = 0;
        rgb[sector_data[sector][2]] = p;

        return cvScalar(rgb[2], rgb[1], rgb[0], 0);
    }

    String coffee;
    public void work(CamShifter csh) throws Exception {
        IplImage capture = grabber.grab();

        System.out.println("paused = "+paused);
        if (capture == null) {
            System.out.println("Could not initialize capturing...\n");
            return;
        }

        while (true) {
            int bin_w;
            if (!paused) {
                frame = grabber.grab();
                if (frame == null) {
                return;
                }
            }

            if (image == null) {
                image = cvCreateImage(frame.cvSize(), 8, 3);
                hsv = cvCreateImage(frame.cvSize(), 8, 3);
                hue = cvCreateImage(frame.cvSize(), 8, 1);
                mask = cvCreateImage(frame.cvSize(), 8, 1);
                backproject = cvCreateImage(frame.cvSize(), 8, 1);
                histimg = cvCreateImage(cvSize(320, 200), 8, 3);
                cvZero(histimg);
                hist = cvCreateHist( 1, hdims, CV_HIST_ARRAY, hranges_arr, 1 );

            }
            cvCopy(frame, image);
            if (!paused)
            {
                cvCvtColor(image, hsv, CV_BGR2HSV);

                if (track_object != 0) {

                    int _vmin = vmin, _vmax = vmax;

                    cvInRangeS(hsv, cvScalar(0, smin, Math.min(_vmin, _vmax), 0), cvScalar(180, 256, Math.max(_vmin, _vmax), 0), mask);
                    cvSplit(hsv, hue, null, null, null);

                    hueArray = new IplImageArray(hue);

                    if (track_object < 0) {
                        float max_val = 0.f;

                        cvSetImageROI(hue, selection);
                        cvSetImageROI(mask, selection);
                        cvCalcHist(hueArray, hist, 0, null);


                        if (max_val != 0) { // TODO: entier non null == true en C, à vérifier
                            max_val = (float) 255. / max_val;
                        } else {
                            max_val = 0;
                        }

                        FloatByReference fl_ref = new FloatByReference(max_val);
                        cvConvertScale(hist.bins(), hist.bins(), Float.parseFloat(fl_ref.toString()), 0);
                        cvResetImageROI(hue);
                        cvResetImageROI(mask);
                        track_window = selection;
                        track_object = 1;

                        cvZero(histimg);
                        bin_w = histimg.width() / hsize;
                        for (int i = 0; i < hsize; i++) {
                            int val = Math.round((int) (cvGetReal1D(hist.bins(), i) * histimg.height() / 255.));
                            CvScalar color = hsv2rgb(i * 180.f / hsize);
                            cvRectangle(histimg, cvPoint(i * bin_w, histimg.height()), cvPoint((i + 1) * bin_w, histimg.height() - val), color, -1, 8, 0);
                        }
                    }

                    cvCalcBackProject(hueArray, backproject, hist);
                    cvAnd(backproject, mask, backproject, null);

                    cvCamShift(backproject, track_window, cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1), track_comp, track_box);
                    track_window = track_comp.rect();

//                        if (track_window.width()*track_window.height()<=1)
//                        {
//                            int cols = backproject.width(), rows = backproject.height(), r = (Math.min(cols, rows)+5)/6;
//                            track_window = cvRect(
//                                    Math.max(track_window.x()-r,0), 
//                                    Math.max(track_window.y()-r,0), 
//                                    Math.min(track_window.x()+r,cols), 
//                                    Math.min(track_window.y()+r,rows));
//                        }

                    if (backproject_mode) {
                        cvCvtColor(backproject, image, CV_GRAY2BGR);
                    }
                    if (image.origin() == 0) {
                        track_box = track_box.angle(-track_box.angle());
                        cvEllipseBox(image, track_box, cvScalar(0, 0, 255, 0), 3, CV_AA, 0);
                    }
                }
            } else if (track_object < 0) {
                paused = false;
            }
            if (select_object && selection.width() > 0 && selection.height() > 0) {
                cvSetImageROI(image, selection);
                cvXorS(image, cvScalarAll(255), image, null);
                cvResetImageROI(image);
            } 
            camshiftDemo.showImage(image);
            histogram.showImage(histimg);

        }

    }

@Override
    public void mouseClicked(MouseEvent e) {
//            System.out.println("Mouse Clicked !");

    }

@Override
    public void mousePressed(MouseEvent e) {
        this.onMouse(MOUSE_PRESSED, e.getX(), e.getY());
        System.out.println("Mouse Pressed !");
        System.out.println("\t e.getX(): "+e.getX());
        System.out.println("\t e.getY(): "+e.getY());
    }

@Override
    public void mouseReleased(MouseEvent e) {
        this.onMouse(MOUSE_RELEASED, e.getX(), e.getY());
        System.out.println("Mouse Released !");
        System.out.println("\t e.getX(): "+e.getX());
        System.out.println("\t e.getY(): "+e.getY());
    }

@Override
    public void mouseEntered(MouseEvent e) {
//            System.out.println("Mouse Entered !");

    }

@Override
    public void mouseExited(MouseEvent e) {
//            System.out.println("Mouse Exited !");

    }
}
包对象跟踪;
导入com.googlecode.javacv.CanvasFrame;
导入com.googlecode.javacv.FrameGrabber;
导入com.googlecode.javacv.OpenCVFrameGrabber;
导入静态com.googlecode.javacv.cpp.opencv_core.*;
导入com.googlecode.javacv.cpp.opencv_core.CvBox2D;
导入com.googlecode.javacv.cpp.opencv_core.CvPoint;
导入com.googlecode.javacv.cpp.opencv_core.CvRect;
导入com.googlecode.javacv.cpp.opencv_core.CvScalar;
导入com.googlecode.javacv.cpp.opencv_core.IplImage;
导入com.googlecode.javacv.cpp.opencv_core.IplImageArray;
导入静态com.googlecode.javacv.cpp.opencv_imgproc.*;
导入com.googlecode.javacv.cpp.opencv_imgproc.CvConnectedComp;
导入com.googlecode.javacv.cpp.opencv_imgproc.CvHistogram;
导入静态com.googlecode.javacv.cpp.opencv_video.*;
导入com.sun.jna.ptr.FloatByReference;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
公共类CamShifter实现MouseListener{
最后按下的静态int鼠标=1;
最终静态int鼠标_释放=2;
IplImage图像、边框、hsv、色调、遮罩、背景投影、历史图像;
IplImageArray;
cvhist;
画布框直方图=新画布框(“直方图”),camshiftDemo=新画布框(“camshiftDemo”);
布尔backproject_mode=false;
布尔选择对象=false;
int track_object=0;
布尔值show_hist=true;
布尔值=假;
CvPoint原点=新CvPoint();
CvRect selection=新的CvRect();
OpenCVFrameGrabber grabber=新的OpenCVFrameGrabber(0);
CvRect track_window=新的CvRect();
CvBox2D轨道箱=新的CvBox2D();
CvConnectedComp轨迹_comp=新CvConnectedComp();
int-hsize=16;
浮动hranges[]={0180};
int[]hdims={hsize};
浮动hranges_arr[]]={hranges};
int-vmin=10,vmax=256,smin=30;
公共静态void main(字符串args[])引发异常{
CamShifter csh=新CamShifter();
csh.工作(csh);
System.out.println(“CamShiftDetector试用版”);
}
public CamShifter()抛出FrameGrabber.Exception{
grabber.start();
camshiftDemo.getCanvas().addMouseListener(此);
}
鼠标上的公共void(int事件、int x、int y){
如果(选择对象){
//获得选择权
内部selX、selY、selW、selH;
selX=Math.min(x,origin.x());
selY=Math.min(y,origin.y());
selW=selX+Math.abs(x-origin.x());
selH=selY+Math.abs(y-origin.y());
选择=cvRect(selX、selY、selW、selH);
System.out.println(“选择:\n(“+selX+”,“+selY+”)\n(“+selW+”,“+selH+”));
//确保所选内容包含在图像中
selX=Math.max(selection.x(),0);
selY=Math.max(selection.y(),0);
selW=Math.min(selection.width(),image.width());
selH=Math.min(selection.height(),image.height());
选择=cvRect(selX,selY,selW-selX,selH-selY);
System.out.println(“确保选择包含在图像中”);
System.out.println(“选择:\n(“+selX+”,“+selY+”)\n(“+selW+”,“+selH+”));
}
开关(事件){
按下鼠标右键:
原点=Cv点(x,y);
选择=cvRect(x,y,0,0);
选择_object=true;
打破
已发布案例鼠标(u):
选择_object=false;
if(selection.width()>0&&selection.height()>0){
跟踪对象=-1;
}
打破
}
}
CVV标量hsv2rgb(浮动色调){
int[]rgb=新int[3];
INTP,部门;
int[][]扇区_数据={{0,2,1},{1,2,0},{1,0,2},{2,0,1},{2,1,0},{0,1,2};
色调*=0.033333F;
扇区=(整数)数学地板(色调);
p=数学圆(255*(色调-扇区));
p=p^1;
内部温度=0;
如果((扇区&1)==1){
温度=255;
}否则{
温度=0;
}
p^=温度;
rgb[section_data[section][0]]=255;
rgb[section_data[section][1]]=0;
rgb[section_data[section][2]]=p;
返回cvScalar(rgb[2],rgb[1],rgb[0],0);
}
串咖啡;
公共无效工作(CamShifter csh)引发异常{
IplImage capture=grabber.grab();
System.out.println(“暂停=”+暂停);
如果(捕获==null){
System.out.println(“无法初始化捕获…\n”);
返回;
}
while(true){
int bin_w;
如果(!暂停){
frame=grabber.grab();
if(frame==null){
返回;
}
}
if(image==null){
image=cvCreateImage(frame.cvSize(),8,3);
hsv=cvCreateImage(frame.cvSize(),8,3);
色调=cvCreateImage(frame.cvSize(),8,1);
mask=cvCreateImage(frame.cvSize(),8,1);
backproject=cvCreateImage(frame.cvSize(),8,1);
histimg=cvCreateImage(cvSize(320200),8,3);
cvZero(histimg);
hist=cvCreateHist(1,hdims,CV_hist_数组,hranges_arr,1);
}
cvCopy(帧、图像);
如果(!暂停)
{
CVT颜色(图像、hsv、CV_BGR2HSV);
如果(轨迹对象!=0){
int _vmin=vmin,_vmax=vmax;
cvInRangeS(hsv,cvScalar(0,smin,数学最小值(_-vmin,_-vmax),0),cvScalar(180,256,数学最大值(_-vmin,_-vmax),0),掩码);
cvSplit(hsv、色调、空值、n