2016-12-12 5 views
0

私はの画像処理と開発を初めておこないました。私はイメージの三角形のピクセルを取る必要があります。それを行うために私は次のコードを使用しました。残念ながら、私は望ましくない黒い画素を得る。その問題を取り除く私はアルファ値を与えて背景[0]ピクセルを削除しようとしました。(透明な背景)しかし、それは次のエラーを返します。どんな助けもありがとうございます。三角形の画像ピクセルを抽出するエラー

マイコード:

Mat img = cv::imread("/home/fabio/code/lena.jpg", cv::IMREAD_GRAYSCALE); 

Mat alpha(img.size(), CV_8UC1, Scalar(0)); 

//triangle definition (example points) 
vector<Point> points; 
points.push_back(Point(200, 70)); 
points.push_back(Point(60, 150)); 
points.push_back(Point(500, 500)); 

//apply triangle to mask 
fillConvexPoly(alpha, points, Scalar(255)); 

cv::Mat finalImage = cv::Mat::zeros(img.size(), img.type()); 

img.copyTo(finalImage, alpha); 

imshow("image", finalImage); 

Mat dst; 

Mat rgb[1]; 
split(finalImage, rgb); 
Mat rgba[2] = { finalImage, alpha }; 
merge(rgba, 2, dst); 

imshow("dst", dst); 

エラー:OpenCVのエラー:不正なチャネルの数(ソース画像が1、3または4チャンネルを持っている必要があります)cvConvertImageで、ファイルC:\は\ 2_4_PackSlave-win64の-VC12を構築-shared \ OpenCVの\モジュール\のHighGUI \ SRC \ utils.cpp、代わりにあなたの最後のブロックの行611

What i need to do

+0

入力画像がグレースケールとしてロードされているため、RGBではなく1つのチャンネルのみです。アルファチャンネルを追加すると、表示できない2チャンネルの画像が表示されます。 imshowでの表示中にopenCVがアルファチャンネルを正しく処理しないので、アルファチャンネル機能をテストするために.pngを保存してください。 – Micka

答えて

1

使用この:

std::vector<cv::Mat> channels; 
cv::split(finalImage,m channels); 
if(channels.size() == 0) 
{ 
    std::cout << "unexpected error" << std::endl; 
    return 1; 
} 
// fill up to reach 3 channels 
while(channels,size() < 3) 
{ 
    channels.push_back(channels[0]); 
} 
// add alpha channel 
channels.push_back(alpha); 
cv::merge(channels, dst); 

私はテストしませんでしたが、これはあなたが欲しいものですか?

+0

あなたの入力イメージがグレースケールであることを確認していない... RGBAに到達するために必要な場合には、より多くのチャンネルを追加 – Micka

+1

@Mikaあなたは正しいと思います。しかし、コードには小さな問題があります。 \t 'オーバーロードされた関数のインスタンスがありません" merge "は引数リストと一致します 引数の型は次のとおりです:(std :: vector >、int、cv :: Mat)\t c:\ Users \ ven \ Documents \ Visual Studio 2013 \ Projects \ current_final \ opencvtest \ opencvtest.cpp \t 230' – Alan

+0

コードを修正しました(できれば)! – Micka