0

下午好,

我正在尝试运行OpenCVDLL在应用程序中使用它LabVIEW

我已正确获取图像LV并将字节数组传递给DLL.

我可以在文本文件中循环并打印出每个像素的值,并将它们与 LV 中的输出相匹配,所以我知道我的所有像素都在正确的位置,除了 LV 在开头添加 2 列,与为高度和宽度保留的前 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 的原始图像/捕获,但我可以说它看起来不像那样,我正在处理灰度的所有内容。

输出图像:

输出

4

2 回答 2

0

你的输入( a )是一个整数矩阵,而 opencv 想要 uchars 在那里。

您当前的操作方式,每个 int(来自 a)都分布在 4 个连续字节上,(这正是我在该图片中看到的)而且它仅使用输入数据的 1st 1/4

你可能不会仅仅将像素指针输入到你的 cv::Mat 那里,循环 a[0],将每个像素投射到 uchar,然后将它分配给 opencv-pixel 应该可以工作,恕我直言

于 2013-02-09T09:16:40.033 回答
0

您可以通过将 CV_8U 替换为 CV_32S 来将图像转换为 uchar 或简单地使用 int 图像,然后:

int offset = 0;
int scale = 0;
cv::Mat image8U;
image.convertTo(image8U, CV_8UC1, scale, offset );
于 2013-02-09T19:52:04.217 回答