使用absdiff

时间:2018-01-08 10:25:17

标签: opencv pylons

我试图从带有pylon和opencv的basler GigE相机视频源中抓取两张照片。两张图片转换为灰度,并使用absdiff进行比较。已更改的像素应该是我正在寻找的对象。

这是代码的while循环。

while(camera.IsGrabbing()) {

            camera.RetrieveResult(5000,ptrGrabResult, TimeoutHandling_ThrowException);      

            if(ptrGrabResult->GrabSucceeded()){
                formatConverter.Convert(pylonImage, ptrGrabResult);
                openCVImage1 = cv::Mat(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC3, (uint8_t *) pylonImage.GetBuffer()); 
            }
            else{
                cout<<"ERROR OpenCVImage1:" <<ptrGrabResult->GetErrorCode()<<ptrGrabResult->GetErrorDescription()<< endl;
            }

            camera.RetrieveResult(5000,ptrGrabResult, TimeoutHandling_ThrowException);
            if(ptrGrabResult->GrabSucceeded()){
                formatConverter.Convert(pylonImage, ptrGrabResult);
                openCVImage2 = cv::Mat(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC3, (uint8_t *) pylonImage.GetBuffer());
            }
            else{
                cout<<"ERROR OpenCVImage2:" <<ptrGrabResult->GetErrorCode()<<ptrGrabResult->GetErrorDescription()<< endl;
            }


            cvtColor(openCVImage1,grayImage1,CV_BGR2GRAY);

            cvtColor(openCVImage2,grayImage2,CV_BGR2GRAY);

            absdiff(grayImage1,grayImage2,differenceImage);
            imshow("DiffImage", differenceImage);
            threshold(differenceImage,thresholdImage,sensitivity, 255, THRESH_BINARY);

            switch(waitKey(10)){
                    case 27: //ESC
                        return 0;
                    case 116:    //t
                          trackingEnabled = !trackingEnabled;
                            if(trackingEnabled=false) cout<<"tracking disabled"<<endl;
                         else cout<<"tracking enabled"<<endl;
                          break;
                    case 112:       //d 
                         debugMode=!debugMode;
                     if(debugMode==false){cout<<"Code paused, press 'p' again to resume"<<endl;
                         while (pause==true) {
                             switch(waitKey(0)){
                                    case 112:   //p
                                      pause = false;
                                      cout<<"Code Resumed"<<endl;
                                      break;
                            }
                        }
                        }
                    }
        //do stuff 
        }

我有三个问题。

首先:The differenceImage is always black。尽管我还没有进入相机。可能我没有正确抓取图片。有谁知道我做错了什么?已经尝试在第二个RetrieveResult之前添加waitKey(10)。

第二:The switch(waitKey(10)) is not working。无论我在键盘上按什么,屏幕上都没有输出。已经尝试使用if和else if,但这并没有解决问题。

第三:If i stop debugging and start debugging again, i get an exception caught by my catch block。可能这是因为我停止调试后相机没有停止抓取。如果我将相机插入并重新插入脚本运行。我尝试使用stopGrabbing()和close(),但它没有工作。

我在Visual Studio 2010中使用Windows 7。 非常感谢提前!

0 个答案:

没有答案