相关疑难解决方法(0)

如何在不改变其他通道的情况下有效地将cv :: Mat的给定通道设置为给定值?

如何在cv::Mat不改变其他通道的情况下有效地将a的给定通道设置为给定值?例如,我想将其第四个通道(alpha通道)值设置为120(即半透明),如:

cv::Mat mat; // with type CV_BGRA
...
mat.getChannel(3) = Scalar(120); // <- this is what I want to do
Run Code Online (Sandbox Code Playgroud)

PS:我当前的解决方案首先分成mat多个通道并设置alpha通道,然后将它们合并.

PS2:我知道如果我也想通过以下方式更改其他频道,我可以快速完成此操作:

mat.setTo(Scalar(54, 154, 65, 120)); 
Run Code Online (Sandbox Code Playgroud)

使用通用解决方案更新:

这两种方法都可以将给定通道的所有mat值设置为给定值.它们将适用于所有矩阵,无论它们是否连续.

方法-1 - 更有效

- >基于@Antonio的答案,并由@MichaelBurdinov进一步改进

// set all mat values at given channel to given value
void setChannel(Mat &mat, unsigned int channel, unsigned char value)
{
    // make sure have enough channels
    if (mat.channels() < channel + 1)
        return;

    const int cols = mat.cols;
    const int …
Run Code Online (Sandbox Code Playgroud)

c++ opencv matrix alpha-transparency color-channel

15
推荐指数
2
解决办法
1万
查看次数

如何使用cvAvg或mean计算集合ROI中像素的"单个"平均值/平均值?

我有一个尺寸为320x320像素的阈值图像.通过设置ROI,我以20x20像素的块循环遍历整个图像.我需要找到每个块的平均值.所以我将这些图像块传递给函数'cvAvg'.我面临以下问题.

  1. 'cvAvg'的返回类型是'CvScalar',它有4个双打.我无法解释文档中的CvScalar.我只需要像"浮动"或"双倍"格式的像素的单个平均值,我需要做出其他决定.如何从函数返回值中提取单个值.我不想迭代所有像素并找到平均值.我想以20x20的块进行处理.例如:如果在20x20的块中200像素是白色且200像素是黑色,我希望能够提取单个值,以便我可以确定块具有50%的白色像素并且我认为平均值/平均值这将是一个很好的了解方式.

  2. 我创建了一个CvScalar类型的变量来检索和打印函数'cvAvg返回的值.但是阈值图像的所有值都是相同的

0.000000 255.000000 0.000000 0.000000

0.000000 255.000000 0.000000 0.000000

0.000000 255.000000 0.000000 0.000000

0.000000 255.000000 0.000000 0.000000

由于阈值图像具有白色和黑色的不同部分,因此循环遍历图像的所有块是不正确的256次.这里发生了什么?代码如下.imgGreenThresh是为绿色设定阈值的"二进制图像".

IplImage* imgDummy = cvCreateImage(cvGetSize(imgGreenThresh), 8, 1);    //Create a dummy image of the same size as thresholded image
cvCopy(imgGreenThresh, imgDummy);                                       //Copy the thresholded image for further operations
CvRect roi;                                                             //Rectangular ROI
CvSize size;
int r, c, N=20;
int count = 0;
float LaserState[16][16];                                               //Create 16x16 matrix to hold the laser state values.
CvScalar meanValue;                                                     // individual windows mean value

size = …
Run Code Online (Sandbox Code Playgroud)

opencv

3
推荐指数
1
解决办法
3万
查看次数

标签 统计

opencv ×2

alpha-transparency ×1

c++ ×1

color-channel ×1

matrix ×1