我刚开始使用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的值仅在我按下一个键后显示(即一旦显示图像)
我的问题是为什么在执行函数之前调用窗口?
答案 0 :(得分:2)
您的代码中的基本问题是您正在阅读彩色图像,但您尝试将其作为灰度处理。因此,指数发生变化,实际发生的是你只处理图像的前三分之一(因为3通道格式)。
旗帜 - 指定加载图像的颜色类型:
&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);