【问题标题】:opencv, selective coloring effectopencv,选择性着色效果
【发布时间】:2014-03-19 20:27:07
【问题描述】:

我想对图像进行效果,使特定颜色保持不变,其余变为灰度。但是,我的程序的输出很糟糕,有人可以帮我改进我的代码吗?当坐标超过 500 时会中断,并且显示的颜色范围太小。提前致谢

代码:

int i1=10, i2=50, a = 10;// coordinates of pixel value, whose color must remain; hue range

IplImage* GetNewImage(IplImage* frame, IplImage* imgHSV){
    IplImage* imgNew = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
    IplImage* imgBW = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
    CvScalar s1;
    CvScalar s2;
    CvScalar s3;
    s3 = cvGet2D(imgHSV, i1, i2);

    cvInRangeS(imgHSV, cvScalar(s3.val[0] - 10, s3.val[1] - 50, s3.val[2] - 50), cvScalar(s3.val[0] + 10, s3.val[1] + 50, s3.val[2] + 50), imgBW);

    imgNew = cvCloneImage(frame);


    for (int i = 0; i < frame->height; i++) for (int j = 0; j < frame->width; j++) {
        s1 = cvGet2D(imgBW, i, j);
        s2 = cvGet2D(imgNew, i, j);
        if (s1.val[0] == 0){

            for (int k = 0; k < 3; k++){
                 s3.val[k] = (s2.val[0] * 0.114 + s2.val[1] * 0.587 + s2.val[2] * 0.299);//converting to grayscale
                     cvSet2D(imgNew, i, j, s3);
            }

        }


    }
    cvReleaseImage(&imgBW);
    return imgNew;
}

【问题讨论】:

  • 站点注释:尝试使用新的 OpenCV API。

标签: opencv image-processing colors


【解决方案1】:
  • 放弃那个过时的 c-api,它已经死了。
  • 您已经了解了 inRange(),将结果用作进一步处理的掩码
  • 已经有了 cvtColor(src,dst,CV_BGR2GRAY),比起滚动你自己更喜欢内置的东西
  • opencv 是一个计算机视觉/ml 库,你把它当作一个二等 Photoshop 来滥用。 - 不要!

【讨论】:

  • 大部分opencv源码都是C,没死。它没有消失。并且如果你忘记了源代码,你将无法阅读它。
  • 我同意贝拉克的观点。为此 +1!
  • 弗拉德,c-api 不再开发。您不能使用 2010 年之后添加的任何内容。使用它对 opencv 的任何贡献都将被拒绝。我称之为——死了。我认为这更像是一个特定的 SO 问题,有时这是一个巨大的过时东西库。
  • @Vlad,顺便说一句,现在大多数 c-api 调用只是对 c++ api 调用的浅包装..
  • 如果你完全打开它,你会看到很多 C 函数。至少在 improc 模块中。大量的例子仍然是c。示例中有两个文件夹 c 和 cpp (至少在 2.4.0.2 版本中)。总的来说,如果某些函数可以用简单的方式编写,为什么不使用 C 呢?但是,如果您在一个有许多合作者的大型项目中工作,C++ 是一个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多