我是图像处理和开发的新手。我需要拍摄图像的内部三角形像素。为了做到这一点,我使用了以下代码。不幸的是我获得了不需要的黑色摆脱那个问题我试图通过给出alfa值来删除背景[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错误:cvConvertImage中的通道数量不足(源图像必须有1,3或4个通道),文件C:\ builds \ 2_4_PackSlave-win64-vc12-shared \ opencv \ modules \ highgui \ src \ utils.cpp,第611行
答案 0 :(得分: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);
我没有测试过,但这应该是你想要的吗?