0

RGB カラーで白色を検出するにはどうすればよいですか?

コード内の色を変更するにはどうすればよいですか、またはコード内で何を変更する必要がありますか?

このコードは赤色を検出します:

#include"math.h"
#include"conio.h"
#include"cv.h"
#include"highgui.h"
#include"stdio.h"
int main() {
    int i,j,k;
    int height,width,step,channels;
    int stepr, channelsr;
    int temp=0;
    uchar *data,*datar;
    i=j=k=0;
    IplImage *frame=cvLoadImage("red.jpg",1);
    IplImage *result=cvCreateImage( cvGetSize(frame), 8, 1 );
    if(frame==NULL ) {
        puts("unable to load the frame");exit(0);
    }
    printf("frame loaded");
    cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Result",CV_WINDOW_AUTOSIZE);
    height = frame->height;
    width = frame->width;
    step =frame->widthStep;
    channels = frame->nChannels;
    data = (uchar *)frame->imageData;
    stepr=result->widthStep;
    channelsr=result->nChannels;
    datar = (uchar *)result->imageData;
    for(i=0;i < (height);i++) for(j=0;j <(width);j++)
    if(((data[i*step+j*channels+2]) > (29+data[i*step+j*channels])) && 
            ((data[i*step+j*channels+2]) > (29+data[i*step+j*channels+1])))
        datar[i*stepr+j*channelsr]=255;
    else
        datar[i*stepr+j*channelsr]=0;
    cvShowImage("original",frame);
    cvShowImage("Result",result);
    cvSaveImage("result.jpg",result);
    cvWaitKey(0);
    cvDestroyWindow("original");
    cvDestroyWindow("Result");
    return 0;
}
4

1 に答える 1

0

3 つの RGB チャンネルがほぼ等しいことを検出すると、黒からグレー、白を経て色が検出されます。白をチェックするために、おそらく各ピクセルをチェックできます

1) 明るい

r > 250、g > 250、b > 250

2) 色はほぼ等しい abs(r - b) < 2, abs(g - b) < 2, abs(r - g) < 2 *

値 250 と 2 は、満足のいく結果が得られるまで実験する必要がある単なる例です。

上記と同等のコードで条件を変更する必要があります

if(((data[i*step+j*channels+2]) > (29+data[i*step+j*channels])) && 
        ((data[i*step+j*channels+2]) > (29+data[i*step+j*channels+1])))
    datar[i*stepr+j*channelsr]=255;
else
    datar[i*stepr+j*channelsr]=0;

*ノート; 値r、g、bが符号なしの場合(この場合はそうです)、数値を符号付きのようにキャストする必要があります

abs((int)r - g) < 2

于 2012-08-29T08:23:57.743 に答える