2011-11-01 145 views
2

我有一個PNG圖像pic.png,我使它透明通過使用下面的函數createMask()斷言失敗(src.type()== dst.type())在OpenCV中

origpic = cvLoadImage("/root/opencv/newtutorial/newcode_try2/pic.png",1); 
    pic = createMask(origpic); 

我有createMask功能

IplImage* createMask(IplImage* image) { 
     IplImage *mask; 
     mask = cvCreateImage(cvGetSize(image), 8, 1); 
     cvInRangeS(image, cvScalar(255.0, 255.0, 255.0), cvScalar(255.0, 255.0, 255.0), mask); 
     cvNot(mask, mask); 
     return mask; 
    } 

現在我的問題是,當我與

cvWarpPerspective(pic, neg_img, warp_matrix);

扭曲它

我收到此錯誤

OpenCV Error: Assertion failed (src.type() == dst.type()) in cvWarpPerspective, 
file /root/OpenCV-2.3.1/modules/imgproc/src/imgwarp.cpp, line 3234 
terminate called after throwing an instance of 'cv::Exception' 
what(): /root/OpenCV-2.3.1/modules/imgproc/src/imgwarp.cpp:3234: 
error: (-215) src.type() == dst.type() in function cvWarpPerspective 

回答

1

你必須創建具有相同的類型PIC的目標圖像。 createMask()函數創建一個灰度圖像。

所以調用warpPerspective之前,加入這一行:

neg_img = cvCreateImage(cvGetSize(pic),8,1); 

注意,你可以使用不同大小的目標圖像,結果將被裁剪,或者根據warp_matrix,填充黑色空間各地:

neg_img = cvCreateImage(CvSize(200,300),8,1); 

而且也更好的想法是使用C++接口,與墊代替的IplImage。它會自動處理內存管理,它更清潔,更易於使用。你實際上必須使用c接口的唯一情況是一些嵌入式系統,其中編譯器只有C。

+0

對不起,我得到這個錯誤OpenCV錯誤:輸入參數的大小不匹配(該操作既不是'數組操作數組'(其中數組具有相同的大小和類型),也不是'數組操作標量',也不是'標量op array')in binary_op,file /root/OpenCV-2.3.1/modules/core/src/arithm.cpp – Wazzzy

+0

這是因爲您嘗試檢查具有3通道標量間隔的單通道圖像的範圍。我無法猜測你爲什麼在那裏實際使用那個呼叫,沒有這一行,代碼將是相同的。 – Sam

+0

哦,我明白了。您必須將圖像轉換爲灰度(cvCvtColor()),並將結果發送到checkrange。你有什麼是3通道圖像,檢查範圍,並試圖存儲在1通道圖像的結果。錯誤! – Sam