首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv image窗口/imshow

opencv image窗口/imshow
EN

Stack Overflow用户
提问于 2013-05-18 18:41:28
回答 2查看 1.6K关注 0票数 1

我刚刚开始使用Open CV库,我的第一个代码之一是一个简单的负转换函数。

代码语言:javascript
复制
#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

void negative(Mat& input,Mat& output)
{
  int row = input.rows;
  int col = input.cols;
  int x,y;
  uchar *input_data=input.data;
  uchar *output_data= output.data;


  for( x=0;x<row;x++)
    for( y=0;y<col;y++)
      output_data[x*col+y]=255-input_data[x*col+y];

    cout<<x<<y;



}

int main( int argc, char** argv )
{
  Mat image;
  image = imread( argv[1], 1 );

  Mat output=image.clone();

  negative(image,output);

  namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
  imshow( "Display Image", output );

  waitKey(0);

  return 0;
}

我添加了额外的一行来检查是否处理了整个图像。我的输出图像面临的问题是,负变换只应用于图像的上半部分。

现在,x和y的值只有在我按下某个键之后才会显示(即图像显示后)。

我的问题是,为什么要在函数执行之前调用窗口?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-18 18:56:13

代码中的基本问题是,您正在读取彩色图像,但您试图将其处理为灰度图像。因此,索引会发生变化,实际发生的情况是您只处理图像的前三分之一(因为采用3通道格式)。

See opencv imread manual

标志-指定加载图像的颜色类型:0强制加载图像为3通道彩色图像

=0加载的图像被强制为灰度

您已经指定了flags=1。

这里有一种方法:

代码语言:javascript
复制
Vec3b v(255, 255, 255);
for(int i=0;i<input.rows;i++) //search for edges
{
    for (int j=0 ;j<input.cols;j++)
    {
        output.at<Vec3b>(i,j) = v - input.at<Vec3b>(i,j);
    }
}

要获得更有效的实现,您可以查看Mat.ptr<Vec3b>(i)

编辑:如果您正在处理大量图像,对于像素上的常规迭代,最快的方法是:

代码语言:javascript
复制
Vec3b v(255, 255, 255); // or maybe Scalar v(255,255,255) Im not sure
for(int i=0;i<input.rows;i++) //search for edges
{
    Vec3b *p=input.ptr<Vec3b>(i);
    Vec3b *q=output.ptr<Vec3b>(i);
    for (int j=0 ;j<input.cols;j++)
    {
        q[j] = v - p[j];
    }
}

请参阅“OpenCV教程”--“高效方法”部分。

票数 2
EN

Stack Overflow用户

发布于 2013-05-18 18:54:44

试着写下:

代码语言:javascript
复制
cout << x << y << endl;

之前调用了该函数,但不会直接刷新输出,这会导致您的图像在文本写入之前出现。通过添加"endline",您可以强制刷新。您也可以使用flush(cout);代替and和endline。

对于负面影响,您可以直接使用OpenCV函数subtract()

代码语言:javascript
复制
subtract(Scalar(255, 255, 255), input, output);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16623353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档