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 cvblob--渲染除白色以外的BLOB_Opencv_Object Detection - Fatal编程技术网

opencv cvblob--渲染除白色以外的BLOB

opencv cvblob--渲染除白色以外的BLOB,opencv,object-detection,Opencv,Object Detection,我正在尝试用cvblob检测对象。不知何故,我的代码只标记白色对象。如何标记其他颜色的物体,如一罐啤酒或一瓶水 这是我的密码: #include "highgui.h" #include "cv.h" #include "cvaux.h" #include "iostream" #include <stdio.h> #include <ctype.h> #include <cvblob.h> using namespace cv; using namesp

我正在尝试用cvblob检测对象。不知何故,我的代码只标记白色对象。如何标记其他颜色的物体,如一罐啤酒或一瓶水

这是我的密码:

#include "highgui.h"
#include "cv.h"
#include "cvaux.h"
#include "iostream"
#include <stdio.h>
#include <ctype.h>

#include <cvblob.h>

using namespace cv;
using namespace std;
using namespace cvb;

int main(int argc, char** argv) {
    CvTracks tracks;

    cvNamedWindow("frame", CV_WINDOW_AUTOSIZE);
    cvMoveWindow("frame", 50, 100);

    CvCapture* capture;

    IplImage* frame = 0;

    capture = cvCreateCameraCapture( 0 ); //capture frames from cam on index 0: /dev/video0/

    if (!capture) {
        return -1;
    }

    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 320);
    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 240);

    frame = cvQueryFrame(capture);

    while(frame) {
        IplImage *gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
        cvCvtColor(frame, gray, CV_BGR2GRAY);
        cvThreshold(gray, gray, 150, 255, CV_THRESH_BINARY);

        IplImage *labelImg=cvCreateImage(cvGetSize(gray), IPL_DEPTH_LABEL, 1);
        CvBlobs blobs;
        unsigned int result=cvLabel(gray, labelImg, blobs);

        cvFilterByArea(blobs, 500, 1000000);
//        cvRenderBlobs(labelImg, blobs, frame, frame, CV_BLOB_RENDER_BOUNDING_BOX);
        cvRenderBlobs(labelImg, blobs, frame, frame, CV_BLOB_RENDER_CENTROID);
        cvUpdateTracks(blobs, tracks, 200., 5);
        cvRenderTracks(tracks, frame, frame, CV_TRACK_RENDER_ID|CV_TRACK_RENDER_BOUNDING_BOX);


        for (CvBlobs::const_iterator it=blobs.begin(); it!=blobs.end(); ++it) {
            cout << "Blob #" << it->second->label << ": Area=" << it->second->area << ", Centroid=(" << it->second->centroid.x << ", " << it->second->centroid.y << ")" << endl;
        }

        cvShowImage("frame", frame);

        cout << "----------------------------" << endl;

        frame = cvQueryFrame(capture);

        char c = cvWaitKey(10);
        if(c==27)
            break;

    }
}
#包括“highgui.h”
#包括“cv.h”
#包括“cvaux.h”
#包括“iostream”
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
使用名称空间cvb;
int main(int argc,字符**argv){
CvTracks;
cvNamedWindow(“框架”,CV_窗口_自动调整大小);
cvMoveWindow(“框架”,50,100);
捕获*捕获;
IplImage*frame=0;
capture=cvCreateCameraCapture(0);//从索引0上的cam捕获帧:/dev/video0/
如果(!捕获){
返回-1;
}
cvSetCaptureProperty(捕捉,CV_CAP_PROP_FRAME_WIDTH,320);
cvSetCaptureProperty(捕捉,CV_CAP_PROP_FRAME_HEIGHT,240);
帧=cvQueryFrame(捕获);
while(框架){
IplImage*gray=cvCreateImage(cvGetSize(帧),IPL_深度_8U,1);
CVT颜色(边框、灰色、CV_bgr2灰色);
cvThreshold(灰色、灰色、150、255、CV_阈值_二进制);
IplImage*labelImg=cvCreateImage(cvGetSize(灰色),IPL_深度_标签,1);
CvBlobs-blobs;
无符号整数结果=cvLabel(灰色、labelImg、斑点);
cvFilterByArea(blobs,5001000000);
//cvRenderBlobs(labelImg,BLOB,frame,frame,CV_BLOB_RENDER_BOUNDING_BOX);
cvRenderBlobs(labelImg,blobs,frame,frame,CV_BLOB_RENDER_CENTROID);
cvUpdateTracks(blob,tracks,200,5);
cvRenderTracks(轨迹、帧、帧、CV_轨迹_渲染_ID | CV_轨迹_渲染_边界_框);
for(CvBlobs::const_迭代器it=blobs.begin();it!=blobs.end();++it){

cout label area centroid.x centroid.y这是默认选项,如果不更改cvblob库中的源代码,则无法更改它

如果你真的想改变这一点很容易,你可以创建一个相同方法的副本,添加一个新的输入变量,比如CvScalar,来选择输出颜色

方法cvRenderBlob将位于cvcontour.cpp中

我对cvblob库做了很多改进,在接下来的几个月里,我将把它推给创建者。

尝试添加:

cvInRangeS(hsvframe,cvScalar(23,41133),cvScalar(40150255),threshy);//表示黄色

在过滤斑点之前,它是一个HSV(而不是RGB)值范围,用于定义所需颜色的阈值


希望有帮助。

这是一个解决方案。我现在就这么做。谢谢