① OpenCV将图像平滑后二值化,运行时程序崩溃,麻烦大家指教,多谢了!(代码见问题补充)
#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;
int main(int argc, char** argv)
{
IplImage* src = cvLoadImage("test.jpg", 1);
IplImage* temp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
IplImage* gray = cvCreateImage(cvGetSize(temp), IPL_DEPTH_8U, 1);
// 预处理:高斯平滑
cvSmooth(src, temp, CV_GAUSSIAN, 3, 3);
// 二值化
cvCvtColor(temp, gray, CV_BGR2GRAY);
cvNamedWindow("src", 0);
cvShowImage("src", src);
cvNamedWindow("temp", 0);
cvShowImage("temp", temp);
cvNamedWindow("gray", 0);
cvShowImage("gray", gray);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&temp);
cvReleaseImage(&gray);
return 0;
}
② openCV 在将图像二值化后,如何保存
就是保存图片吗?
用函数cvSaveImage(“binary.jpg”,bianry); 就可以了。你将保存名字为binary 的二值图像到你的程序所在目录下。
③ 如何使用opencv实时读取且对图像二值化
你好!
直接对图像矩阵求和,然后除以图像面积就OK了。若是分块的话,就要先用bwlabel标注连通区域,然后统计分析。
谢谢望采纳
④ opencv中的二值化函数是什么方法
//将标记处改成如下即可:
#include "stdafx.h"
//#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
using namespace cv;
int main(int argc,char** argv)
{
IplImage *src=cvLoadImage("D:\\Lena.jpg",0);
if(src==NULL)
{
return 0;
}
cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
cvShowImage("src", src);
IplImage *dst1_img=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
cvSmooth (src, dst1_img, CV_GAUSSIAN, 11, 0, 0, 0);
cvNamedWindow ("Gaussian", CV_WINDOW_AUTOSIZE);
cvShowImage ("Gaussian", dst1_img);
IplImage *adaptive_img = cvCreateImage(cvGetSize(dst1_img),IPL_DEPTH_8U,1);
cvAdaptiveThreshold(dst1_img, adaptive_img, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 8); //函数改成这样即可
cvNamedWindow ("adaptive", CV_WINDOW_AUTOSIZE);
cvShowImage ("adaptive", adaptive_img);
waitKey();
return 0;
⑤ opencv中所有什么函数可以实现灰度图像二值化
扫描是最基本的特效显示方式,它没有划分图像块,只是顺序地一行一行或一列一列地显示图像。下面的程序是向下扫描的代码实现。/***************************************************************************函数名:*
Scan(CDC
*pDC)**函数参数:*
CDC
*pDC-指向设备环境的指针,用于显示位图数据**返回值:*
无**说明:该函数实现了图像的扫描显示的效果**************************************************************************/void
SpecialEffectShow::Scan(CDC
*pDC)
//扫描显示一幅图像}
以上代码主要调用了StretchDIBits()函数,在SpecialEffectShow类的其他特效显示中也都调用了该函数。StretchDIBits函数是全局的Win32
API函数,它的作用是拷贝源位图中的一个矩形区域的数据,然后显示到目标设备环境中的一个矩形中,如果源矩形和目标矩形的大小不一样,StretchDIBits函数有压缩或拉伸源位图的功能。以下是该函数参数的说明。
int
StretchDIBits(HDC
hdc,
//
handle
to
DCint
XDest,
//
x-coord
of
destination
upper-left
cornerint
YDest,
//
y-coord
of
destination
upper-left
cornerint
nDestWidth,
//
width
of
destination
rectangleint
nDestHeight,
//
height
of
destination
rectangleint
XSrc,
//
x-coord
of
source
upper-left
cornerint
YSrc,
//
y-coord
of
source
upper-left
cornerint
nSrcWidth,
//
width
of
source
rectangleint
nSrcHeight,
//
height
of
source
rectangleCONST
VOID
*lpBits,
//
bitmap
bitsCONST
BITMAPINFO
*lpBitsInfo,
//
bitmap
dataUINT
iUsage,
//
usage
optionsDWORD
dwRop
//
raster
operation
code);
HDC
hdc:目标设备环境句柄;XDest:目标矩形左上角的X坐标,坐标是逻辑单位,在MM_TEXT映射模式下,一个逻辑单位为一个像素(有关映射模式的问题,请读者参考其他图书或MSDN);YDest:目标矩形左上角的Y坐标,坐标是逻辑单位;nDestWidth:目标矩形的宽度,坐标是逻辑单位;nDestHeight:目标矩形的高度,坐标是逻辑单位;XSrc:指定源位图图像矩形的左上角的X坐标,坐标单位是图像的像素;YSrc:指定源位图图像矩形的左上角的Y坐标,坐标单位是图像的像素;nSrcWidth:源位图图像矩形的宽度,坐标单位是图像的像素;nSrcHeight:源位图图像矩形的高度,坐标单位是图像的像素;lpBits:源位图数据指针;lpBitsInfo:指向源位图的BITMAPINFO结构的指针;iUsage:函数使用方式,详细参数说明请参考MSDN;
dwRop:当使用压缩或拉伸功能时所使用的光栅模式,详细参数说明请参考MSDN。我们在视图类CChap1_6View中映射“扫描显示”菜单事件处理函数OnScan(
⑥ opencv抓取摄像头图像 二值化
把pBkImg中这个IPL_DEPTH_32F换成跟你原图像一致的IPL_DEPTH_8U,再试试看。CV_Assert( src.depth() == dst.depth() );
⑦ 用opencv对图像进行二值化有什么作用
小噪点用中值滤波,或者 erode + dilate 也可以,你自己试着看下效果。大的洞一般是眼睛什么的,不需要补。
⑧ OPENCV有关16位图像二值化的问题
THRESH_BINARY类型可以自己写个函数二值化好了,效率一样很高
for(intr=0;r<m_img16.rows;++r)
for(intc=0;c<m_img16.cols;++c)
{
unsignedshort&v=m_img16.at<unsignedshort>(r,c);
v=v>=1000?65535:0;
}
⑨ 使用opencv进行图像的二值化处理时有下面这样一段代码,我不太理解,大家可以给我逐行解释一下吗谢谢!
这个就是用三个循环,按照图片高,宽,和通道的顺序去判断每个像素值是否大于某个阈值,如果大于阈值,则设置为255(也就是白),否则就就设置为0(也就是黑)。
图片的高宽不需要解释,图片的通道常见的就是RGB。
for(i=0;i<height;i++)
for(j=0;j<width;j++)
for(k=0;k<Channels;k++)\\RGB 的话,Channels可能是3,或者4。opencv习惯4个通道,但是最后
\\ 一个通道没用
{
if(data0[i*step+j+k]>thresh)\\ 这个就是判断data0这个里面第i行,j列那个像素第k个通道的值是否大
\\于该阈值
data1[i*step+j+k] = 255;
else
data1[i*step+j+k] = 0;
}
⑩ 图像二值化的OpenCV
OpenCV中有两个函数可以实现图片的二值化:
(1)cvThreshold( dst, dst,230 , 255, CV_THRESH_BINARY_INV);
(2)cvAdaptiveThreshold( dst, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 9, -10);
方法(1)是手动指定一个阈值,以此阈值来进行二值化处理。其中的第四个参数决定了该方法的结果:
threshold_type=CV_THRESH_BINARY:
dst(x,y) = max_value, if src(x,y)>threshold 0, otherwise.
threshold_type=CV_THRESH_BINARY_INV:
dst(x,y) = 0, if src(x,y)>threshold; dst(x,y) = max_value, otherwise.
threshold_type=CV_THRESH_TRUNC:
dst(x,y) = threshold, if src(x,y)>threshold; dst(x,y) = src(x,y), otherwise.
threshold_type=CV_THRESH_TOZERO:
dst(x,y) = src(x,y), if (x,y)>threshold ; dst(x,y) = 0, otherwise.
threshold_type=CV_THRESH_TOZERO_INV:
dst(x,y) = 0, if src(x,y)>threshold ; dst(x,y) = src(x,y), otherwise.
值得一说的是threshold_type可以使用CV_THRESH_OTSU类型,这样该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起 作用。比如:cvThreshold( dst, dst,300 , 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);这种方法对于灰度直方图呈现二峰特征的图片处理起来效果很好。
方法(2)是一个自适应阈值二值化方法,通过设定最后两个参数来调整效果。