VC6.0里面运用openCV将灰度图像转换成矩阵,报错。需要如何解决。设置堆栈? 程序如下:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC6.0里面运用openCV将灰度图像转换成矩阵,报错。需要如何解决。设置堆栈? 程序如下:相关的知识,希望对你有一定的参考价值。

#include<iostream.h>
#include<fstream.h>
#include "cv.h"
#include "highgui.h"

//using namespace std;

int main(int argc,char** argv)

cout<<"进入系统----------->"<<endl;
//1、读入150*130灰度图片,将矩阵拉成一行
IplImage* img = cvLoadImage("F:\vc++\MyProjects\image.jpg",0);
cout<<"----------------------图片加载成功!--------------------"<<endl;
CvMat* imgMat = cvCreateMat(img->height,img->width,CV_32FC1);//定义一个指向CvMat对象的指针
cvConvert(img,imgMat);
cout<<"图像转换成矩阵成功!"<<endl;

//将矩阵拉成一行
CvMat row_header, *row;
row = cvReshape( imgMat, &row_header, 0, 1 );
cout<<row->cols<<endl;

//显示原图片。
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("window");

图片。

原型:
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade)
输入:strImgFilename 图片文件名
huiGrade 图像灰度化标志,0 no; >1 and <=256 灰度级
输出:width 图像宽度
height 图像高度
返回值:图像的点阵数据(按照24位BMP格式)

extern "C"

__declspec(dllexport)
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade);


#pragma comment(lib,"icePubDll.lib")

char *bmpBuffer=NULL;
int imgWidth, imgHeight;

bmpBuffer = icePub_getBufferFromImg2 ("e:\\a.jpg",&imgWidth,&imgHeight,0);
//然后对bmpBuffer数据处理即可

if(bmpBuffer != NULL)
free(bmpBuffer);

原型:
int WINAPI icePub_makeBmpFile(char *strBmpFilename,char *bmpBuffer,int height,int width)
输入:strBmpFileName 待生成图像文件名
bmpBuffer 图像点阵数据(按照24位BMP格式)
height 图像高
width 图像宽
输出:

extern "C"

__declspec(dllexport)
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade);
__declspec(dllexport)
int WINAPI icePub_makeBmpFile(char *strBmpFilename,char *bmpBuffer,int height,int width);


#pragma comment(lib,"icePubDll.lib")

char *bmpBuffer=NULL;
int imgWidth, imgHeight;

bmpBuffer = icePub_getBufferFromImg2 ("e:\\a.jpg",&imgWidth,&imgHeight,0);
//然后对bmpBuffer数据处理即可

icePub_makeBmpFile("e:\\a.bmp",bmpBuffer,imgWidth,imgHeight);

if(bmpBuffer != NULL)
free(bmpBuffer);追问

你在说什么,可以说明下么。。。可以帮我看看我的程序的问题怎么解决么,或者帮我把这个图转化成矩阵。谢谢。

追答

冒汗,俺不会用openCV...sorry

参考技术A 前面的两个头文件不要加.h,如果是C++的话,你读入文件的路径是错的,要加两个\\,然后再在链接里面加入OPENCV的库就可以了。。

程序改后如下:
#include<iostream>
#include<fstream>
#include "cv.h"
#include "highgui.h"

using namespace std;

int main(int argc,char** argv)

cout<<"进入系统----------->"<<endl;
//1、读入150*130灰度图片,将矩阵拉成一行
IplImage* img = cvLoadImage("F:\\vc++\\MyProjects\\image.jpg",0);
cout<<"----------------------图片加载成功!--------------------"<<endl;
CvMat* imgMat = cvCreateMat(img->height,img->width,CV_32FC1);//定义一个指向CvMat对象的指针
cvConvert(img,imgMat);
cout<<"图像转换成矩阵成功!"<<endl;

//将矩阵拉成一行
CvMat row_header, *row;
row = cvReshape( imgMat, &row_header, 0, 1 );
cout<<row->cols<<endl;

//显示原图片。
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("window");
参考技术B 是不是应该把图像转化为单通道的图像 再进行矩阵赋值
实例:(pFrame为读取的图像结构体)
pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);

pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);

//转化成单通道图像再处理
cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);

cvConvert(pFrImg, pFrameMat);
cvConvert(pFrImg, pFrMat);
cvConvert(pFrImg, pBkMat);
参考技术C lz明显就是路径错误。。。"F:\vc++\MyProjects\image.jpg"——"F:\\vc++\\MyProjects\\image.jpg" 参考技术D 兄弟,做出来了么?我也需要啊,嫩给一份么?qq940004529

JAVA 图像处理基于OpenCv与JVM-----图像物体高亮显示(掩膜)

OpenCv提供了一个非常有用的函数叫做Canny,它可以高亮显示图像中的线条。

OpenCv的canny函数可以检测灰度矩阵中的轮廓。我们需要做的只是把输入的矩阵转换成灰度图像,剩下的由Canny完成。
             Canny函数包含以下参数:
             源矩阵
             目标矩阵
             低阈值,使用150.0
             高阈值,通常是低阈值的2倍或3倍
             光圈,3~7之间的一个奇数,我们使用3。光圈值越大,被检测到的轮廓越多
             L2梯度,暂时设置为true
Canny使用一个卷积矩阵包含一个核心像素和它的邻居像素,得到一个梯度值。如果梯度值大于高阈值,那么它就被检测为边界。如果梯度值在高阈值和低阈值之间,并且有个高阈值和它连接,那么它也会被保留。

通过Core类中的cvtColor函数,OpenCv可以很容易地改变颜色空间。

这篇文章中有关于灰度教程:JAVA 图像处理基于OpenCv与JVM-----加载保存图像

下面直接上代码:

import org.opencv.core.CvType;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import origami.Origami;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.imgcodecs.Imgcodecs;
public class HelloCv
    public static void main(String[] args) throws Exception
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
      Mat tools = Imgcodecs.imread("./images/dw.jpg");
      Imgproc.cvtColor(tools,tools,Imgproc.COLOR_RGB2GRAY);、、
      Imgproc.Canny(tools,tools,900,1100,5,true);
      Imgcodecs.imwrite("./images/dw-1.png",tools);
      Mat inverTools = tools.clone();
      Core.bitwise_not(inverTools, inverTools);
      Imgcodecs.imwrite("./images/dw.png",inverTools);
      Mat kittens = Imgcodecs.imread("./images/dw.jpg");
      Imgproc.cvtColor(kittens,kittens,Imgproc.COLOR_RGB2GRAY);//转换颜色
      Imgproc.Canny(kittens,kittens,900,1100,5,true);
      Core.bitwise_not(kittens, kittens);//反色操作,让物体更容易辨认

        //生成掩膜图片
      Mat target = new Mat(kittens.height(),kittens.width(),CvType.CV_8UC3,new Scalar(0,0,255));
      Mat bg = Imgcodecs.imread("./images/dw.jpg");
      Imgproc.resize(bg,bg,target.size());
      bg.copyTo(target,kittens);
      Imgcodecs.imwrite("./images/target.png",target);
   

 

 

 

以上是关于VC6.0里面运用openCV将灰度图像转换成矩阵,报错。需要如何解决。设置堆栈? 程序如下:的主要内容,如果未能解决你的问题,请参考以下文章

求用opencv把摄像头读取的图像转换成矩阵形式的代码

JAVA 图像处理基于OpenCv与JVM-----图像物体高亮显示(掩膜)

JAVA 图像处理基于OpenCv与JVM-----图像物体高亮显示(掩膜)

JAVA 图像处理基于OpenCv与JVM-----图像物体高亮显示(掩膜)

数组/矩阵转换成Image类

如何用opencv提取一张图片的像素矩阵