2008年7月19日 星期六

資料結構操作與運算-IplImage,CvMat的邏輯運算

邏輯運算,在OpenCV裡面基本的就是And,Or,Not,Xor,邏輯運算的部份只適合用在uchar型別,float跟double為IEEE754的規格,所以不適合用邏輯運算,下面為邏輯運算一般性的運用--合成圖片

邏輯運算圖形合成與反白
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int main()
{
    IplImage *Image1,*Image2,*Image3,*Image4,*Image5;
    Image1=cvLoadImage("Block.jpg",1);
    Image2=cvLoadImage("bower.jpg",1);
    Image3=cvCreateImage(cvSize(384,512),IPL_DEPTH_8U,3);
    Image4=cvLoadImage("footpath.jpg",1);
    Image5=cvCloneImage(Image3);

    CvRect Rect1=cvRect(140,305,115,165);
    cvSetImageROI(Image4,Rect1);
    cvSet(Image4,cvScalar(0,0,0));
    cvResetImageROI(Image4);
    Rect1=cvRect(0,0,Image2->width,Image2->height);
    cvSetImageROI(Image4,Rect1);

    cvAnd(Image1,Image2,Image3);
    cvXor(Image3,Image4,Image5);

    cvNot(Image2,Image2);

    cvNamedWindow("Not bower",1);
    cvShowImage("Not bower",Image2);
    cvNamedWindow("Compose pic",1);
    cvShowImage("Compose pic",Image5);
    cvWaitKey(0);
}

原始圖片:

(Block.jpg)(bower.jpg)(footpath.jpg)

執行結果:


上面的程式用到了之前的bower.jpg與footpath.jpg的圖片,而對footpath.jpg製作ROI,在座標(140,305)的地方設立寬115高165的方框,並把那部分設為黑色,再重置ROI,設立感興趣的區域為寬384高512的大小,因為邏輯運算的函式兩張圖片必須要同樣通道數,同樣大小,再對bower.jpg跟Block.jpg做AND運算,運算出來的結果再跟ROI後的footpath.jpg做XOR,而cvNot()的部份,則是將bower.jpg的原圖反白.而大部分的邏輯運算都有支援圖形遮罩的功能.

(1)圖形做AND運算


(2)圖形做XOR運算


(3)圖形做NOT運算


再來是CvMat邏輯運算的實作

CvMat的邏輯運算
#include <cv.h>
#include <highgui.h>
#include <stdio.h>


uchar MatrixData1[]={255,255,255,0};
uchar MatrixData2[]={192,168,0,3};
uchar MatrixData3[]={7,233,0,255};
uchar MatrixData4[4];
void PrintMatrix(CvMat *Matrix);

int main()
{
    CvMat Matrix1=cvMat(1,4,CV_8UC1,MatrixData1);
    CvMat Matrix2=cvMat(1,4,CV_8UC1,MatrixData2);
    CvMat Matrix3=cvMat(1,4,CV_8UC1,MatrixData3);
    CvMat Matrix4=cvMat(1,4,CV_8UC1,MatrixData4);

    printf("\nMatrix Not:\n");
    cvNot(&Matrix3,&Matrix4);
    PrintMatrix(&Matrix4);

    printf("\nMatrix And:\n");
    cvAnd(&Matrix1,&Matrix2,&Matrix4);
    PrintMatrix(&Matrix4);

    printf("\nMatrix Or:\n");
    cvOr(&Matrix2,&Matrix3,&Matrix4);
    PrintMatrix(&Matrix4);

    printf("\nMatrix Xor:\n ");
    cvXor(&Matrix2,&Matrix3,&Matrix4);
    PrintMatrix(&Matrix4);

    printf("\nMatrix AndS:\n");
    cvAndS(&Matrix3,cvRealScalar(38),&Matrix4);
    PrintMatrix(&Matrix4);

    printf("\nMatrix OrS:\n");
    cvOrS(&Matrix3,cvRealScalar(207),&Matrix4);
    PrintMatrix(&Matrix4);

    printf("\nMatrix XorS:\n");
    cvXorS(&Matrix3,cvRealScalar(128),&Matrix4);
    PrintMatrix(&Matrix4);

    system("pause");
}

void PrintMatrix(CvMat *Matrix)
{
    for(int j=0;j<4;j++)
    {
        printf("%.f ",cvGet2D(Matrix,0,j).val[0]);
    }
    printf("\n");
}

執行結果:


這邊的AND運算就是子網路遮罩(Subnet Mask)的原理,cvAndS(),cvSubS(),cvOrS(),cvXorS()的S代表著是對全1純量的邏輯運算,且支援多通道的邏輯運算,以下分類說明

1.cvNot(&Matrix3,&Matrix4)


2.cvAnd(&Matrix1,&Matrix2,&Matrix4)


3.cvOr(&Matrix2,&Matrix3,&Matrix4)


4.cvXor(&Matrix2,&Matrix3,&Matrix4)


5.cvAndS(&Matrix3,cvRealScalar(38),&Matrix4)


6.cvOrS(&Matrix3,cvRealScalar(207),&Matrix4)


7.cvXorS(&Matrix3,cvRealScalar(128),&Matrix4)


cvNot()
對所有位元數值的0變1,1變0,簡單來說,就是將它反白.但是輸入跟輸出必須要同大小,同通道數據.
cvNot(目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構)

cvAnd()
對兩張圖形做AND邏輯運算,具有兩個輸入一個輸出,且有遮罩(Mask)的功能.輸入跟輸出必須要同大小,同通道數據.
cvAnd(目標IplImage資料結構或CvMat結構,目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)

cvOr()
對兩張圖做OR邏輯運算,具有兩個輸入一個輸出,且有遮罩的功能.輸入跟輸出必須要同大小,同通道數據.
cvAnd(目標IplImage資料結構或CvMat結構,目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)

cvXor()
對兩張圖做Xor邏輯運算,具有兩個輸入一個輸出,且有遮罩的功能.輸入跟輸出必須要同大小,同通道數據.
cvXor(目標IplImage資料結構或CvMat結構,目標IplImage資料結構或CvMat結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)

cvAndS()
對目標圖與全1純量積矩陣做AND邏輯運算,第一個引數為目標矩陣,第二個引數為CvScalar資料結構的純量值,可支援多通道,且具有遮罩的功能.
cvAndS(目標IplImage資料結構或CvMat結構,CvScalar純量結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)

cvOrS()
對目標圖與全1純量積矩陣做Or邏輯運算,第一個引數為目標矩陣,第二個引數為CvScalar資料結構的純量值,可支援多通道,且具有遮罩的功能.
cvOrS(目標IplImage資料結構或CvMat結構,CvScalar純量結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)

cvXorS()
對目標圖與全1純量積矩陣做XOr邏輯運算,第一個引數為目標矩陣,第二個引數為CvScalar資料結構的純量值,可支援多通道,且具有遮罩的功能.
cvXorS(目標IplImage資料結構或CvMat結構,CvScalar純量結構,輸出IplImage資料結構或CvMat資料結構,IplImage資料結構目標Mask區域)



2 意見:

匿名 提到...

做的相当好,支持!!!!

匿名 提到...

為什麼我執行後沒有執行畫面?

Copyright 2008-2009,yester