下午好,
我正在尝试通过OpenCV
运行DLL
并在LabVIEW
应用程序中使用它。
我在LV
中正确获取了一个图像,并将字节数组传递给DLL
。
我可以在文本文件中循环并打印出每个像素的值,并将它们与LV中的输出相匹配,因此我知道我的所有像素都在正确的位置,因为LV在此处添加了2列。开头,前两个值保留为高度和宽度,其余为任意数字。但所有这一切应该是在图像的左侧产生条纹。
接下来,我使用以下行来转换和显示图像。
a[0]
,a[1]
...等是渠道。
输出图像以非常水平拉伸的图像形式出现,像素间隔15-20像素,并被黑色像素包围。我附上了截图
_declspec (dllexport) double imageProcess(int **a, int &x, int &y, int &cor,int &cog,int &cob,int &cow, int th, int hth)
{
y = a[0][0];
x = a[0][1];
Mat image(y, x, CV_8U, a[0]);
namedWindow( "Display window", CV_WINDOW_NORMAL ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
return (0);
}
此外,我尝试使用此代码具有相同的效果:
IplImage* cv_image = cvCreateImageHeader(cvSize(x,y), IPL_DEPTH_8U, 1);
cvSetData(cv_image, a[0], cv_image->widthStep);
Mat image = Mat(cv_image, false);
任何人都可以帮我解释为什么在我的图像创作过程中会发生这种情况吗?
注意,不幸的是,我不能提供LV的原始图像/捕获,但我可以说它看起来不像那样,我正在使用灰度级的所有内容。
输出图片:
答案 0 :(得分:0)
你的输入(a)是一个int的矩阵,而opencv想要那里的uchars。
当前的方式,每个int(来自a)分布在4个连续的字节上, (这正是我在那张照片中看到的) 它也仅使用输入数据的第1 1/4
你可能不会因为将像素指针输入你的cv :: Mat那里而侥幸成功, 循环遍历[0],将每个像素转换为uchar,然后将其分配给opencv像素 应该工作,imho
答案 1 :(得分:0)
您可以将图像转换为uchar或简单使用int图像,方法是将CV_8U替换为CV_32S,然后:
int offset = 0;
int scale = 0;
cv::Mat image8U;
image.convertTo(image8U, CV_8UC1, scale, offset );