① 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)是一個自適應閾值二值化方法,通過設定最後兩個參數來調整效果。