【问题标题】:Extract image pixels of triangle Error提取三角形误差的图像像素
【发布时间】:2024-04-18 07:15:01
【问题描述】:

我是图像处理和开发的新手。我需要获取图像的内部三角形像素。为了做到这一点,我使用了以下代码。不幸的是,我获得了不需要的黑色像素。摆脱这个问题我试图通过给出 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 行

【问题讨论】:

  • 您的输入图像以灰度加载,这就是为什么它不是 RGB 而是只有一个通道的原因。添加 alpha 通道将达到无法显示的 2 通道图像。请记住,openCV 在使用 imshow 显示期间不会正确处理 alpha 通道,因此最好保存为 .png 以测试 alpha 通道功能。

标签: c++ opencv


【解决方案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);

我没有测试,但这应该是你想要的?

【讨论】:

  • 没有看到您的输入图像是灰度的...如果有必要添加更多通道以达到 RGBA
  • @Mika 你的想法我认为是正确的,非常感谢。但是代码有小问题。 no instance of overloaded function "merge" matches the argument list argument types are: (std::vector&lt;cv::Mat, std::allocator&lt;cv::Mat&gt;&gt;, int, cv::Mat) c:\Users\ven\Documents\Visual Studio 2013\Projects\current_final\opencvtest\opencvtest.cpp 230
  • @Mika 没有错误。但同样的结果。什么也没有变。只是 lena 图像 tangle 与黑色像素。
  • 您无法移除像素。图像总是矩形的,所以总会有一些部分被你的三角形覆盖。你想显示什么而不是黑色像素?
  • 你不能...你想用三角形做什么?通常对于处理,您会使用遮罩来不处理不需要的像素。为了显示,您将使用渲染引擎和 Alpha 通道。为了打印,你可以用剪刀剪下三角形。