opencv图像窗口/ imshow

时间:2013-05-18 10:41:28

标签: c++ opencv

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

#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的值仅在我按下一个键后显示(即一旦显示图像)

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

2 个答案:

答案 0 :(得分:2)

您的代码中的基本问题是您正在阅读彩色图像,但您尝试将其作为灰度处理。因此,指数发生变化,实际发生的是你只处理图像的前三分之一(因为3通道格式)。

See opencv imread manual

  

旗帜 -   指定加载图像的颜色类型:
  &gt; 0加载的图像被强制为3通道彩色图像
  = 0加载的图像被强制为灰度

您已指定flags = 1。

这是一种方法:

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);
    }
}

请注意,此处Vec3b是3通道像素值,而uchar是1通道值。
为了更有效地实施,您可以查看Mat.ptr<Vec3b>(i)

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

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教程” - “高效方式”部分。

答案 1 :(得分:1)

尝试写:

cout << x << y << endl;

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


对于否定,您可以直接使用OpenCV函数subtract()

subtract(Scalar(255, 255, 255), input, output);