日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv图像处理常用完整示例代码总结

發布時間:2025/4/14 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv图像处理常用完整示例代码总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

顯示圖像

#include "StdAfx.h" #include <string> #include <iostream> #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp>using namespace cv; using namespace std;int main() {string imageName = “lena.jpg”;//讀入圖像Mat img = imread(imageName, CV_LOAD_IMAGE_COLOR);//如果讀入圖像失敗if (img.empty()){cout<<”Could not open or find the image!”<<endl;return -1;}//創建窗口namedWindow(“lena”, CV_WINDOW_AUTOSIZE);//顯示圖像imshow(“lena”, img);//等待按鍵,按鍵盤任意鍵返回waitKey();return 0; }

加載-RGB轉灰度圖-保存

#include “StdAfx.h” #include <cv.h> #include <highgui.h> #include <string>using namespace cv; using namespace std;int main() {char* imageName = “lena.jpg”;Mat image = imread(imageName, 1);if (!image.data){cout<<”Could not open or find the image!”<<endl;return -1;}Mat gray_image;String grayImageName = “lena_gray”;cvtColor(image,gray_image,CV_RGB2GRAY);//將RGB圖像轉換成灰度圖像imwrite(“../../lena_gray.jpg”,gray_image);//保存圖像namedWindow(imageName, CV_WINDOW_AUTOSIZE);//創建用于顯示元圖像窗口namedWindow(grayImageName,CV_WINDOW_AUTOSIZE);//創建用于顯示轉換后圖像窗口imshow(imageName,image);imshow(“grayImageName”, gray_image);waitKey(0);return 0; } <h1>膨脹操作示例</h1><pre name="code" class="cpp">#include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include <iostream>using namespace std; using namespace cv;int main( ) {//載入原圖 Mat image = imread("1.jpg");//創建窗口 namedWindow("原圖-膨脹操作");namedWindow("效果圖-膨脹操作");//顯示原圖imshow("原圖-膨脹操作", image);//獲取自定義核Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));Mat out;//進行膨脹操作dilate(image,out, element);//顯示效果圖imshow("效果圖-膨脹操作", out);waitKey(0);return 0; }

腐蝕操作示例

#include <opencv2/core/core.hpp>

#include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include <iostream>using namespace std; using namespace cv;int main( ) {//載入原圖 Matimage = imread("1.jpg");//創建窗口 namedWindow("原圖-腐蝕操作");namedWindow("效果圖-腐蝕操作");//顯示原圖imshow("原圖-腐蝕操作", image);//獲取自定義核Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));Mat out;//進行腐蝕操作erode(image,out, element);//顯示效果圖imshow("效果圖-腐蝕操作", out);waitKey(0);return 0; }

膨脹與腐蝕綜合示例

#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include <iostream>using namespace std; using namespace cv;Mat g_srcImage, g_dstImage;//原始圖和效果圖 int g_nTrackbarNumer = 0;//0表示腐蝕erode, 1表示膨脹dilate int g_nStructElementSize = 3; //結構元素(內核矩陣)的尺寸void Process();//膨脹和腐蝕的處理函數 void on_TrackbarNumChange(int, void *);//回調函數 void on_ElementSizeChange(int, void *);//回調函數int main( ) {//改變console字體顏色system("color5E"); //載入原圖g_srcImage= imread("1.jpg");if(!g_srcImage.data ) { printf("Oh,no,讀取srcImage錯誤~!\n"); return false; }//顯示原始圖namedWindow("原始圖");imshow("原始圖", g_srcImage);//進行初次腐蝕操作并顯示效果圖namedWindow("效果圖");//獲取自定義核Matelement = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));erode(g_srcImage,g_dstImage, element);imshow("效果圖", g_dstImage);//創建軌跡條createTrackbar("腐蝕/膨脹", "效果圖", &g_nTrackbarNumer, 1, on_TrackbarNumChange);createTrackbar("內核尺寸", "效果圖",&g_nStructElementSize, 21, on_ElementSizeChange);//輸出一些幫助信息cout<<endl<<"\t嗯。運行成功,請調整滾動條觀察圖像效果~\n\n"<<"\t按下“q”鍵時,程序退出~!\n"<<"\n\n\t\t\t\tby毛毛";//輪詢獲取按鍵信息,若下q鍵,程序退出while(char(waitKey(1))!= 'q') {}return 0; }//進行自定義的腐蝕和膨脹操作 void Process() {//獲取自定義核Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));//進行腐蝕或膨脹操作if(g_nTrackbarNumer== 0) { erode(g_srcImage,g_dstImage, element);}else{dilate(g_srcImage,g_dstImage, element);}//顯示效果圖imshow("效果圖", g_dstImage); }//腐蝕和膨脹之間切換開關的回調函數 void on_TrackbarNumChange(int, void *) {//腐蝕和膨脹之間效果已經切換,回調函數體內需調用一次Process函數,使改變后的效果立即生效并顯示出來Process(); }//腐蝕和膨脹操作內核改變時的回調函數 void on_ElementSizeChange(int, void *) {//內核尺寸已改變,回調函數體內需調用一次Process函數,使改變后的效果立即生效并顯示出來Process(); }

膨脹與腐蝕綜合示例2

#include "cv.h" #include "highgui.h" #include "opencv2/imgproc/imgproc.hpp"using namespace std; using namespace cv;#define TYPE_MORPH_RECT (0) #define TYPE_MORPH_CROSS (1) #define TYPE_MORPH_ELLIPSE (2)#define MAX_ELE_TYPE (2) #define MAX_ELE_SIZE (20)Mat src, erode_dst, dilate_dst;const char *erode_wn = "eroding demo"; const char *dilate_wn = "dilating demo";int erode_ele_type; int dilate_ele_type; int erode_ele_size; int dilate_ele_size;static void Erosion(int, void *); static void Dilation(int, void *);/** @brief * @inputs * @outputs * @retval */ int main(int argc, char *argv[]) {if (argc < 2) {cout<<"Usage: ./eroding_and_dilating [file name]"<<endl;return -1;}src = imread(argv[1]);if (!src.data) {cout<<"Read image failure."<<endl;return -1;}// WindowsnamedWindow(erode_wn, WINDOW_AUTOSIZE);namedWindow(dilate_wn, WINDOW_AUTOSIZE);// Track Bar for ErosioncreateTrackbar("Element Type\n0:Rect\n1:Cross\n2:Ellipse", erode_wn, &erode_ele_type, MAX_ELE_TYPE, Erosion); // callback @ErosioncreateTrackbar("Element Size: 2n+1", erode_wn, &erode_ele_size, MAX_ELE_SIZE, Erosion);// Track Bar for DilationcreateTrackbar("Element Type\n0:Rect\n1:Cross\n2:Ellipse", dilate_wn, &dilate_ele_type, MAX_ELE_TYPE, Dilation); // callback @ErosioncreateTrackbar("Element Size: 2n+1", dilate_wn, &dilate_ele_size, MAX_ELE_SIZE, Dilation);// Default startErosion(0, 0);Dilation(0, 0);waitKey(0);return 0; }/** @brief 腐蝕操作的回調函數* @inputs * @outputs * @retval */ static void Erosion(int, void *) {int erode_type;switch (erode_ele_type) {case TYPE_MORPH_RECT:erode_type = MORPH_RECT; break;case TYPE_MORPH_CROSS:erode_type = MORPH_CROSS;break;case TYPE_MORPH_ELLIPSE:erode_type = MORPH_ELLIPSE;break;default:erode_type = MORPH_RECT;break;}Mat ele = getStructuringElement(erode_type, Size(2*erode_ele_size+1, 2*erode_ele_size+1), Point(erode_ele_size, erode_ele_size));erode(src, erode_dst, ele);imshow(erode_wn, erode_dst); }/** @brief 膨脹操作的回調函數* @inputs * @outputs * @retval */ static void Dilation(int, void *) {int dilate_type;switch (dilate_ele_type) {case TYPE_MORPH_RECT:dilate_type = MORPH_RECT; break;case TYPE_MORPH_CROSS:dilate_type = MORPH_CROSS;break;case TYPE_MORPH_ELLIPSE:dilate_type = MORPH_ELLIPSE;break;default:dilate_type = MORPH_RECT;break;}Mat ele = getStructuringElement(dilate_type, Size(2*dilate_ele_size+1, 2*dilate_ele_size+1), Point(dilate_ele_size, dilate_ele_size));dilate(src, dilate_dst, ele);imshow(dilate_wn, dilate_dst); }

Qt圖像的縮放顯示

#include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_openButton_clicked() {QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files (*.png *.jpg *.bmp)"));qDebug()<<"filenames:"<<fileName;image = cv::imread(fileName.toAscii().data());ui->imgfilelabel->setText(fileName);//here use 2 ways to make a copy // image.copyTo(originalimg); //make a copyoriginalimg = image.clone(); //clone the imgqimg = Widget::Mat2QImage(image);display(qimg); //display by the labelif(image.data){ui->saltButton->setEnabled(true);ui->originalButton->setEnabled(true);ui->reduceButton->setEnabled(true);} }QImage Widget::Mat2QImage(const cv::Mat &mat) {QImage img;if(mat.channels()==3){//cvt Mat BGR 2 QImage RGBcvtColor(mat,rgb,CV_BGR2RGB);img =QImage((const unsigned char*)(rgb.data),rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);}else{img =QImage((const unsigned char*)(mat.data),mat.cols,mat.rows,mat.cols*mat.channels(),QImage::Format_RGB888);}return img; }void Widget::display(QImage img) {QImage imgScaled;imgScaled = img.scaled(ui->imagelabel->size(),Qt::KeepAspectRatio); // imgScaled = img.QImage::scaled(ui->imagelabel->width(),ui->imagelabel->height(),Qt::KeepAspectRatio);ui->imagelabel->setPixmap(QPixmap::fromImage(imgScaled)); }void Widget::on_originalButton_clicked() {qimg = Widget::Mat2QImage(originalimg);display(qimg); }void Widget::on_saltButton_clicked() {salt(image,3000);qimg = Widget::Mat2QImage(image);display(qimg); } void Widget::on_reduceButton_clicked() {colorReduce0(image,64);qimg = Widget::Mat2QImage(image);display(qimg); } void Widget::salt(cv::Mat &image, int n) {int i,j;for (int k=0; k<n; k++){i= qrand()%image.cols;j= qrand()%image.rows;if (image.channels() == 1){ // gray-level imageimage.at<uchar>(j,i)= 255;}else if (image.channels() == 3){ // color imageimage.at<cv::Vec3b>(j,i)[0]= 255;image.at<cv::Vec3b>(j,i)[1]= 255;image.at<cv::Vec3b>(j,i)[2]= 255;}} }// using .ptr and [] void Widget::colorReduce0(cv::Mat &image, int div) {int nl= image.rows; // number of linesint nc= image.cols * image.channels(); // total number of elements per linefor (int j=0; j<nl; j++){uchar* data= image.ptr<uchar>(j);for (int i=0; i<nc; i++){// process each pixel ---------------------data[i]= data[i]/div*div+div/2;// end of pixel processing ----------------} // end of line} }
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QImage> #include <QFileDialog> #include <QTimer> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv;namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget(); private slots:void on_openButton_clicked();QImage Mat2QImage(const cv::Mat &mat);void display(QImage image);void salt(cv::Mat &image, int n);void on_saltButton_clicked();void on_reduceButton_clicked();void colorReduce0(cv::Mat &image, int div);void on_originalButton_clicked();private:Ui::Widget *ui;cv::Mat image;cv::Mat originalimg; //store the original imgQImage qimg;QImage imgScaled;cv::Mat rgb; };#endif // WIDGET_H
#include <iostream>#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>// using .ptr and [] void colorReduce0(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols * image.channels(); // total number of elements per linefor (int j=0; j<nl; j++) {uchar* data= image.ptr<uchar>(j);for (int i=0; i<nc; i++) {// process each pixel ---------------------data[i]= data[i]/div*div + div/2;// end of pixel processing ----------------} // end of line } }// using .ptr and * ++ void colorReduce1(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols * image.channels(); // total number of elements per linefor (int j=0; j<nl; j++) {uchar* data= image.ptr<uchar>(j);for (int i=0; i<nc; i++) {// process each pixel ---------------------*data++= *data/div*div + div/2;// end of pixel processing ----------------} // end of line } }// using .ptr and * ++ and modulo void colorReduce2(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols * image.channels(); // total number of elements per linefor (int j=0; j<nl; j++) {uchar* data= image.ptr<uchar>(j);for (int i=0; i<nc; i++) {// process each pixel ---------------------int v= *data;*data++= v - v%div + div/2;// end of pixel processing ----------------} // end of line } }// using .ptr and * ++ and bitwise void colorReduce3(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols * image.channels(); // total number of elements per lineint n= static_cast<int>(log(static_cast<double>(div))/log(2.0));// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0for (int j=0; j<nl; j++) {uchar* data= image.ptr<uchar>(j);for (int i=0; i<nc; i++) {// process each pixel ---------------------*data++= *data&mask + div/2;// end of pixel processing ----------------} // end of line } }// direct pointer arithmetic void colorReduce4(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols * image.channels(); // total number of elements per lineint n= static_cast<int>(log(static_cast<double>(div))/log(2.0));int step= image.step; // effective width// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0// get the pointer to the image bufferuchar *data= image.data;for (int j=0; j<nl; j++) {for (int i=0; i<nc; i++) {// process each pixel ---------------------*(data+i)= *data&mask + div/2;// end of pixel processing ----------------} // end of line data+= step; // next line} }// using .ptr and * ++ and bitwise with image.cols * image.channels() void colorReduce5(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint n= static_cast<int>(log(static_cast<double>(div))/log(2.0));// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0for (int j=0; j<nl; j++) {uchar* data= image.ptr<uchar>(j);for (int i=0; i<image.cols * image.channels(); i++) {// process each pixel ---------------------*data++= *data&mask + div/2;// end of pixel processing ----------------} // end of line } }// using .ptr and * ++ and bitwise (continuous) void colorReduce6(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols * image.channels(); // total number of elements per lineif (image.isContinuous()) {// then no padded pixelsnc= nc*nl; nl= 1; // it is now a 1D array}int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0for (int j=0; j<nl; j++) {uchar* data= image.ptr<uchar>(j);for (int i=0; i<nc; i++) {// process each pixel ---------------------*data++= *data&mask + div/2;// end of pixel processing ----------------} // end of line } }// using .ptr and * ++ and bitwise (continuous+channels) void colorReduce7(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols ; // number of columnsif (image.isContinuous()) {// then no padded pixelsnc= nc*nl; nl= 1; // it is now a 1D array}int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0for (int j=0; j<nl; j++) {uchar* data= image.ptr<uchar>(j);for (int i=0; i<nc; i++) {// process each pixel ---------------------*data++= *data&mask + div/2;*data++= *data&mask + div/2;*data++= *data&mask + div/2;// end of pixel processing ----------------} // end of line } }// using Mat_ iterator void colorReduce8(cv::Mat &image, int div=64) {// get iteratorscv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();for ( ; it!= itend; ++it) {// process each pixel ---------------------(*it)[0]= (*it)[0]/div*div + div/2;(*it)[1]= (*it)[1]/div*div + div/2;(*it)[2]= (*it)[2]/div*div + div/2;// end of pixel processing ----------------} }// using Mat_ iterator and bitwise void colorReduce9(cv::Mat &image, int div=64) {// div must be a power of 2int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0// get iteratorscv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();// scan all pixelsfor ( ; it!= itend; ++it) {// process each pixel ---------------------(*it)[0]= (*it)[0]&mask + div/2;(*it)[1]= (*it)[1]&mask + div/2;(*it)[2]= (*it)[2]&mask + div/2;// end of pixel processing ----------------} }// using MatIterator_ void colorReduce10(cv::Mat &image, int div=64) {// get iteratorscv::Mat_<cv::Vec3b> cimage= image;cv::Mat_<cv::Vec3b>::iterator it=cimage.begin();cv::Mat_<cv::Vec3b>::iterator itend=cimage.end();for ( ; it!= itend; it++) { // process each pixel ---------------------(*it)[0]= (*it)[0]/div*div + div/2;(*it)[1]= (*it)[1]/div*div + div/2;(*it)[2]= (*it)[2]/div*div + div/2;// end of pixel processing ----------------} }void colorReduce11(cv::Mat &image, int div=64) {int nl= image.rows; // number of linesint nc= image.cols; // number of columnsfor (int j=0; j<nl; j++) {for (int i=0; i<nc; i++) {// process each pixel ---------------------image.at<cv::Vec3b>(j,i)[0]=image.at<cv::Vec3b>(j,i)[0]/div*div + div/2;image.at<cv::Vec3b>(j,i)[1]=image.at<cv::Vec3b>(j,i)[1]/div*div + div/2;image.at<cv::Vec3b>(j,i)[2]=image.at<cv::Vec3b>(j,i)[2]/div*div + div/2;// end of pixel processing ----------------} // end of line } }// with input/ouput images void colorReduce12(const cv::Mat &image, // input image cv::Mat &result, // output imageint div=64) {int nl= image.rows; // number of linesint nc= image.cols ; // number of columns// allocate output image if necessaryresult.create(image.rows,image.cols,image.type());// created images have no padded pixelsnc= nc*nl; nl= 1; // it is now a 1D arrayint n= static_cast<int>(log(static_cast<double>(div))/log(2.0));// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0for (int j=0; j<nl; j++) {uchar* data= result.ptr<uchar>(j);const uchar* idata= image.ptr<uchar>(j);for (int i=0; i<nc; i++) { // process each pixel ---------------------*data++= (*idata++)&mask + div/2;*data++= (*idata++)&mask + div/2;*data++= (*idata++)&mask + div/2;// end of pixel processing ---------------- } // end of line } }// using overloaded operators void colorReduce13(cv::Mat &image, int div=64) { int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0// perform color reductionimage=(image&cv::Scalar(mask,mask,mask))+cv::Scalar(div/2,div/2,div/2); }

圖像銳化1

sharp.h

#pragma once #include <opencv\cv.h> using namespace cv; namespace ggicci {void sharpen(const Mat& img, Mat& result); }
sharp.cpp #include "sharp.h" void ggicci::sharpen(const Mat& img, Mat& result) { result.create(img.size(), img.type());//處理邊界內部的像素點, 圖像最外圍的像素點應該額外處理for (int row = 1; row < img.rows-1; row++){//前一行像素點const uchar* previous = img.ptr<const uchar>(row-1);//待處理的當前行const uchar* current = img.ptr<const uchar>(row);//下一行const uchar* next = img.ptr<const uchar>(row+1);uchar *output = result.ptr<uchar>(row);int ch = img.channels();int starts = ch;int ends = (img.cols - 1) * ch;for (int col = starts; col < ends; col++){//輸出圖像的遍歷指針與當前行的指針同步遞增, 以每行的每一個像素點的每一個通道值為一個遞增量, 因為要考慮到圖像的通道數*output++ = saturate_cast<uchar>(5 * current[col] - current[col-ch] - current[col+ch] - previous[col] - next[col]);}} //end loop//處理邊界, 外圍像素點設為 0result.row(0).setTo(Scalar::all(0));result.row(result.rows-1).setTo(Scalar::all(0));result.col(0).setTo(Scalar::all(0));result.col(result.cols-1).setTo(Scalar::all(0)); }
main.cpp #include <opencv\highgui.h> #pragma comment(lib, "opencv_core231d.lib") #pragma comment(lib, "opencv_highgui231d.lib") #pragma comment(lib, "opencv_imgproc231d.lib")using namespace cv;#include "sharp.h"int main() { Mat lena = imread("lena.jpg");Mat sharpenedLena;ggicci::sharpen(lena, sharpenedLena);imshow("lena", lena);imshow("sharpened lena", sharpenedLena);cvWaitKey();return 0; }

圖像銳化2

int main() { Mat lena = imread("lena.jpg");Mat sharpenedLena;Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);cv::filter2D(lena, sharpenedLena, lena.depth(), kernel);imshow("lena", lena);imshow("sharpened lena", sharpenedLena);cvWaitKey();return 0; }

簡單的灰度圖像的直方圖計算

int main(){ Mat img = imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);Mat* arrays = &img;int narrays = 1;int channels[] = { 0 };InputArray mask = noArray();Mat hist;int dims = 1;int histSize[] = { 256 }; float hranges[] = { 0.0, 255.0 };const float *ranges[] = { hranges };//調用 calcHist 計算直方圖, 結果存放在 hist 中calcHist(arrays, narrays, channels, mask, hist, dims, histSize, ranges);//調用一個我自己寫的簡單的函數用于獲取一張顯示直方圖數據的圖片,//輸入參數為直方圖數據 hist 和期望得到的圖片的尺寸Mat histImg = ggicci::getHistogram1DImage(hist, Size(600, 420));imshow("lena gray image histogram", histImg);waitKey();}Mat ggicci::getHistogram1DImage(const Mat& hist, Size imgSize){Mat histImg(imgSize, CV_8UC3);int Padding = 10;int W = imgSize.width - 2 * Padding;int H = imgSize.height - 2 * Padding;double _max;minMaxLoc(hist, NULL, &_max);double Per = (double)H / _max;const Point Orig(Padding, imgSize.height-Padding);int bin = W / (hist.rows + 2);//畫方柱for (int i = 1; i <= hist.rows; i++){Point pBottom(Orig.x + i * bin, Orig.y);Point pTop(pBottom.x, pBottom.y - Per * hist.at<float>(i-1));line(histImg, pBottom, pTop, Scalar(255, 0, 0), bin);}//畫 3 條紅線標明區域line(histImg, Point(Orig.x + bin, Orig.y - H), Point(Orig.x + hist.rows * bin, Orig.y - H), Scalar(0, 0, 255), 1);line(histImg, Point(Orig.x + bin, Orig.y), Point(Orig.x + bin, Orig.y - H), Scalar(0, 0, 255), 1);line(histImg, Point(Orig.x + hist.rows * bin, Orig.y), Point(Orig.x + hist.rows * bin, Orig.y - H), Scalar(0, 0, 255), 1);drawArrow(histImg, Orig, Orig+Point(W, 0), 10, 30, Scalar::all(0), 2);drawArrow(histImg, Orig, Orig-Point(0, H), 10, 30, Scalar::all(0), 2);return histImg;}

圖像縮放-最近鄰插值-雙線性插值

#include "stdafx.h" #include <cv.h> #include <cxcore.h> #include <highgui.h> #include <cmath>using namespace std; using namespace cv;int main(int argc ,char ** argv) {IplImage *scr=0;IplImage *dst=0;double scale=4;CvSize dst_cvsize;if (argc==2&&(scr=cvLoadImage(argv[1],-1))!=0){dst_cvsize.width=(int)(scr->width*scale);dst_cvsize.height=(int)(scr->height*scale);dst=cvCreateImage(dst_cvsize,scr->depth,scr->nChannels);cvResize(scr,dst,CV_INTER_NN);// // CV_INTER_NN - 最近鄰插值, // CV_INTER_LINEAR - 雙線性插值 (缺省使用) // CV_INTER_AREA - 使用象素關系重采樣。當圖像縮小時候,該方法可以避免波紋出現。/*當圖像放大時,類似于 CV_INTER_NN 方法..*/ // CV_INTER_CUBIC - 立方插值.cvNamedWindow("scr",CV_WINDOW_AUTOSIZE);cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);cvShowImage("scr",scr);cvShowImage("dst",dst);cvWaitKey();cvReleaseImage(&scr);cvReleaseImage(&dst);cvDestroyWindow("scr");cvDestroyWindow("dst");}return 0; }

圖片加“懷舊色”濾鏡保存輸出

#include <opencv/cv.h> #include <opencv/highgui.h>using namespace cv; using namespace std;int main(int argc, char ** argv) {// input args checkif(argc < 3){printf("please input args.\n");printf("e.g. : ./test infilepath outfilepath \n");return 0;}char * input = argv[1];char * output = argv[2];printf("input: %s, output: %s\n", input, output);Mat src = imread(input, 1);int width=src.cols;int heigh=src.rows;RNG rng;Mat img(src.size(),CV_8UC3);for (int y=0; y<heigh; y++){uchar* P0 = src.ptr<uchar>(y);uchar* P1 = img.ptr<uchar>(y);for (int x=0; x<width; x++){float B=P0[3*x];float G=P0[3*x+1];float R=P0[3*x+2];float newB=0.272*R+0.534*G+0.131*B;float newG=0.349*R+0.686*G+0.168*B;float newR=0.393*R+0.769*G+0.189*B;if(newB<0)newB=0;if(newB>255)newB=255;if(newG<0)newG=0;if(newG>255)newG=255;if(newR<0)newR=0;if(newR>255)newR=255;P1[3*x] = (uchar)newB;P1[3*x+1] = (uchar)newG;P1[3*x+2] = (uchar)newR;}}//imshow("out",img);waitKey();imwrite(output,img); }

浮雕和雕刻效果

#include <cv.h> #include <highgui.h> #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib, "highgui.lib" ) int main() { IplImage *org=cvLoadImage("1.jpg",1); IplImage *image=cvCloneImage(org); int width=image->width; int height=image->height; int step=image->widthStep; int channel=image->nChannels; uchar* data=(uchar *)image->imageData; for(int i=0;i<width-1;i++) { for(int j=0;j<height-1;j++) { for(int k=0;k<channel;k++) { int temp = data[(j+1)*step+(i+1)*channel+k]-data[j*step+i*channel+k]+128;//浮雕 //int temp = data[j*step+i*channel+k]-data[(j+1)*step+(i+1)*channel+k]+128;//雕刻 if(temp>255) { data[j*step+i*channel+k]=255; } else if(temp<0) { data[j*step+i*channel+k]=0; } else { data[j*step+i*channel+k]=temp; } } } } cvNamedWindow("original",1); cvShowImage("original",org); cvNamedWindow("image",1); cvShowImage("image",image); cvWaitKey(0); cvDestroyAllWindows(); cvReleaseImage(&image); cvReleaseImage(&org); return 0; }

圖像褶皺效果

#include <cv.h> #include <highgui.h> #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib, "highgui.lib" ) int main() { IplImage *org=cvLoadImage("lena.jpg",1); IplImage *image=cvCloneImage(org); int width=image->width; int height=image->height; int step=image->widthStep; int channel=image->nChannels; uchar* data=(uchar *)image->imageData; int sign=-1; for(int i=0;i<height;i++) { int cycle=10; int margin=(i%cycle); if((i/cycle)%2==0) { sign=-1; } else { sign=1; } if(sign==-1) { margin=cycle-margin; for(int j=0;j<width-margin;j++) { for(int k=0;k<channel;k++) { data[i*step+j*channel+k]=data[i*step+(j+margin)*channel+k]; } } } else if(sign==1) { for(int j=0;j<width-margin;j++) { for(int k=0;k<channel;k++) { data[i*step+j*channel+k]=data[i*step+(j+margin)*channel+k]; } } } } cvNamedWindow("original",1); cvShowImage("original",org); cvNamedWindow("image",1); cvShowImage("image",image); cvSaveImage("image.jpg",image); cvWaitKey(0); cvDestroyAllWindows(); cvReleaseImage(&image); cvReleaseImage(&org); return 0; }

Grabcut算法

#include "stdafx.h" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include "ComputeTime.h" #include "windows.h" using namespace std; using namespace cv; static void help() { cout << "\nThis program demonstrates GrabCut segmentation -- select an object in a region\n" "and then grabcut will attempt to segment it out.\n" "Call:\n" "./grabcut <image_name>\n" "\nSelect a rectangular area around the object you want to segment\n" << "\nHot keys: \n" "\tESC - quit the program\n" "\tr - restore the original image\n" "\tn - next iteration\n" "\n" "\tleft mouse button - set rectangle\n" "\n" "\tCTRL+left mouse button - set GC_BGD pixels\n" "\tSHIFT+left mouse button - set CG_FGD pixels\n" "\n" "\tCTRL+right mouse button - set GC_PR_BGD pixels\n" "\tSHIFT+right mouse button - set CG_PR_FGD pixels\n" << endl; } const Scalar RED = Scalar(0,0,255); const Scalar PINK = Scalar(230,130,255); const Scalar BLUE = Scalar(255,0,0); const Scalar LIGHTBLUE = Scalar(255,255,160); const Scalar GREEN = Scalar(0,255,0); const int BGD_KEY = CV_EVENT_FLAG_CTRLKEY; //Ctrl鍵 const int FGD_KEY = CV_EVENT_FLAG_SHIFTKEY; //Shift鍵 static void getBinMask( const Mat& comMask, Mat& binMask ) { if( comMask.empty() || comMask.type()!=CV_8UC1 ) CV_Error( CV_StsBadArg, "comMask is empty or has incorrect type (not CV_8UC1)" ); if( binMask.empty() || binMask.rows!=comMask.rows || binMask.cols!=comMask.cols ) binMask.create( comMask.size(), CV_8UC1 ); binMask = comMask & 1; //得到mask的最低位,實際上是只保留確定的或者有可能的前景點當做mask } class GCApplication { public: enum{ NOT_SET = 0, IN_PROCESS = 1, SET = 2 }; static const int radius = 2; static const int thickness = -1; void reset(); void setImageAndWinName( const Mat& _image, const string& _winName ); void showImage() const; void mouseClick( int event, int x, int y, int flags, void* param ); int nextIter(); int getIterCount() const { return iterCount; } private: void setRectInMask(); void setLblsInMask( int flags, Point p, bool isPr ); const string* winName; const Mat* image; Mat mask; Mat bgdModel, fgdModel; uchar rectState, lblsState, prLblsState; bool isInitialized; Rect rect; vector<Point> fgdPxls, bgdPxls, prFgdPxls, prBgdPxls; int iterCount; }; /*給類的變量賦值*/ void GCApplication::reset() { if( !mask.empty() ) mask.setTo(Scalar::all(GC_BGD)); bgdPxls.clear(); fgdPxls.clear(); prBgdPxls.clear(); prFgdPxls.clear(); isInitialized = false; rectState = NOT_SET; //NOT_SET == 0 lblsState = NOT_SET; prLblsState = NOT_SET; iterCount = 0; } /*給類的成員變量賦值而已*/ void GCApplication::setImageAndWinName( const Mat& _image, const string& _winName ) { if( _image.empty() || _winName.empty() ) return; image = &_image; winName = &_winName; mask.create( image->size(), CV_8UC1); reset(); } /*顯示4個點,一個矩形和圖像內容,因為后面的步驟很多地方都要用到這個函數,所以單獨拿出來*/ void GCApplication::showImage() const { if( image->empty() || winName->empty() ) return; Mat res; Mat binMask; if( !isInitialized ) image->copyTo( res ); else { getBinMask( mask, binMask ); image->copyTo( res, binMask ); //按照最低位是0還是1來復制,只保留跟前景有關的圖像,比如說可能的前景,可能的背景 } vector<Point>::const_iterator it; /*下面4句代碼是將選中的4個點用不同的顏色顯示出來*/ for( it = bgdPxls.begin(); it != bgdPxls.end(); ++it ) //迭代器可以看成是一個指針 circle( res, *it, radius, BLUE, thickness ); for( it = fgdPxls.begin(); it != fgdPxls.end(); ++it ) //確定的前景用紅色表示 circle( res, *it, radius, RED, thickness ); for( it = prBgdPxls.begin(); it != prBgdPxls.end(); ++it ) circle( res, *it, radius, LIGHTBLUE, thickness ); for( it = prFgdPxls.begin(); it != prFgdPxls.end(); ++it ) circle( res, *it, radius, PINK, thickness ); /*畫矩形*/ if( rectState == IN_PROCESS || rectState == SET ) rectangle( res, Point( rect.x, rect.y ), Point(rect.x + rect.width, rect.y + rect.height ), GREEN, 2); imshow( *winName, res ); } /*該步驟完成后,mask圖像中rect內部是3,外面全是0*/ void GCApplication::setRectInMask() { assert( !mask.empty() ); mask.setTo( GC_BGD ); //GC_BGD == 0 rect.x = max(0, rect.x); rect.y = max(0, rect.y); rect.width = min(rect.width, image->cols-rect.x); rect.height = min(rect.height, image->rows-rect.y); (mask(rect)).setTo( Scalar(GC_PR_FGD) ); //GC_PR_FGD == 3,矩形內部,為可能的前景點 } void GCApplication::setLblsInMask( int flags, Point p, bool isPr ) { vector<Point> *bpxls, *fpxls; uchar bvalue, fvalue; if( !isPr ) //確定的點 { bpxls = &bgdPxls; fpxls = &fgdPxls; bvalue = GC_BGD; //0 fvalue = GC_FGD; //1 } else //概率點 { bpxls = &prBgdPxls; fpxls = &prFgdPxls; bvalue = GC_PR_BGD; //2 fvalue = GC_PR_FGD; //3 } if( flags & BGD_KEY ) { bpxls->push_back(p); circle( mask, p, radius, bvalue, thickness ); //該點處為2 } if( flags & FGD_KEY ) { fpxls->push_back(p); circle( mask, p, radius, fvalue, thickness ); //該點處為3 } } /*鼠標響應函數,參數flags為CV_EVENT_FLAG的組合*/ void GCApplication::mouseClick( int event, int x, int y, int flags, void* ) { // TODO add bad args check switch( event ) { case CV_EVENT_LBUTTONDOWN: // set rect or GC_BGD(GC_FGD) labels { bool isb = (flags & BGD_KEY) != 0, isf = (flags & FGD_KEY) != 0; if( rectState == NOT_SET && !isb && !isf )//只有左鍵按下時 { rectState = IN_PROCESS; //表示正在畫矩形 rect = Rect( x, y, 1, 1 ); } if ( (isb || isf) && rectState == SET ) //按下了alt鍵或者shift鍵,且畫好了矩形,表示正在畫前景背景點 lblsState = IN_PROCESS; } break; case CV_EVENT_RBUTTONDOWN: // set GC_PR_BGD(GC_PR_FGD) labels { bool isb = (flags & BGD_KEY) != 0, isf = (flags & FGD_KEY) != 0; if ( (isb || isf) && rectState == SET ) //正在畫可能的前景背景點 prLblsState = IN_PROCESS; } break; case CV_EVENT_LBUTTONUP: if( rectState == IN_PROCESS ) { rect = Rect( Point(rect.x, rect.y), Point(x,y) ); //矩形結束 rectState = SET; setRectInMask(); assert( bgdPxls.empty() && fgdPxls.empty() && prBgdPxls.empty() && prFgdPxls.empty() ); showImage(); } if( lblsState == IN_PROCESS ) //已畫了前后景點 { setLblsInMask(flags, Point(x,y), false); //畫出前景點 lblsState = SET; showImage(); } break; case CV_EVENT_RBUTTONUP: if( prLblsState == IN_PROCESS ) { setLblsInMask(flags, Point(x,y), true); //畫出背景點 prLblsState = SET; showImage(); } break; case CV_EVENT_MOUSEMOVE: if( rectState == IN_PROCESS ) { rect = Rect( Point(rect.x, rect.y), Point(x,y) ); assert( bgdPxls.empty() && fgdPxls.empty() && prBgdPxls.empty() && prFgdPxls.empty() ); showImage(); //不斷的顯示圖片 } else if( lblsState == IN_PROCESS ) { setLblsInMask(flags, Point(x,y), false); showImage(); } else if( prLblsState == IN_PROCESS ) { setLblsInMask(flags, Point(x,y), true); showImage(); } break; } } /*該函數進行grabcut算法,并且返回算法運行迭代的次數*/ int GCApplication::nextIter() { if( isInitialized ) //使用grab算法進行一次迭代,參數2為mask,里面存的mask位是:矩形內部除掉那些可能是背景或者已經確定是背景后的所有的點,且mask同時也為輸出 //保存的是分割后的前景圖像 grabCut( *image, mask, rect, bgdModel, fgdModel, 1 ); else { if( rectState != SET ) return iterCount; if( lblsState == SET || prLblsState == SET ) grabCut( *image, mask, rect, bgdModel, fgdModel, 1, GC_INIT_WITH_MASK ); else grabCut( *image, mask, rect, bgdModel, fgdModel, 1, GC_INIT_WITH_RECT ); isInitialized = true; } iterCount++; bgdPxls.clear(); fgdPxls.clear(); prBgdPxls.clear(); prFgdPxls.clear(); return iterCount; } GCApplication gcapp; static void on_mouse( int event, int x, int y, int flags, void* param ) { gcapp.mouseClick( event, x, y, flags, param ); } int main( int argc, char** argv ) { string filename; cout<<" Grabcuts ! \n"; cout<<"input image name: "<<endl; cin>>filename; Mat image = imread( filename, 1 ); if( image.empty() ) { cout << "\n Durn, couldn't read image filename " << filename << endl; return 1; } help(); const string winName = "image"; cvNamedWindow( winName.c_str(), CV_WINDOW_AUTOSIZE ); cvSetMouseCallback( winName.c_str(), on_mouse, 0 ); gcapp.setImageAndWinName( image, winName ); gcapp.showImage(); for(;;) { int c = cvWaitKey(0); switch( (char) c ) { case '\x1b': cout << "Exiting ..." << endl; goto exit_main; case 'r': cout << endl; gcapp.reset(); gcapp.showImage(); break; case 'n': ComputeTime ct ; ct.Begin(); int iterCount = gcapp.getIterCount(); cout << "<" << iterCount << "... "; int newIterCount = gcapp.nextIter(); if( newIterCount > iterCount ) { gcapp.showImage(); cout << iterCount << ">" << endl; cout<<"運行時間: "<<ct.End()<<endl; } else cout << "rect must be determined>" << endl; break; } } exit_main: cvDestroyWindow( winName.c_str() ); return 0; }

lazy snapping

lszySnapping.cpp

LazySnapping.cpp#include "stdafx.h" #include <cv.h> #include <highgui.h> #include "graph.h" #include <vector> #include <iostream> #include <cmath> #include <string> using namespace std; typedef Graph<float,float,float> GraphType; class LasySnapping { public : LasySnapping(); ~LasySnapping() { if(graph) { delete graph; } }; private : vector<CvPoint> forePts; vector<CvPoint> backPts; IplImage* image; // average color of foreground points unsigned char avgForeColor[3]; // average color of background points unsigned char avgBackColor[3]; public : void setImage(IplImage* image) { this->image = image; graph = new GraphType(image->width*image->height,image->width*image->height*2); } // include-pen locus void setForegroundPoints(vector<CvPoint> pts) { forePts.clear(); for(int i =0; i< pts.size(); i++) { if(!isPtInVector(pts[i],forePts)) { forePts.push_back(pts[i]); } } if(forePts.size() == 0) { return; } int sum[3] = {0}; for(int i =0; i < forePts.size(); i++) { unsigned char* p = (unsigned char*)image->imageData + forePts[i].x * 3 + forePts[i].y*image->widthStep; sum[0] += p[0]; sum[1] += p[1]; sum[2] += p[2]; } cout<<sum[0]<<" " <<forePts.size()<<endl; avgForeColor[0] = sum[0]/forePts.size(); avgForeColor[1] = sum[1]/forePts.size(); avgForeColor[2] = sum[2]/forePts.size(); } // exclude-pen locus void setBackgroundPoints(vector<CvPoint> pts) { backPts.clear(); for(int i =0; i< pts.size(); i++) { if(!isPtInVector(pts[i],backPts)) { backPts.push_back(pts[i]); } } if(backPts.size() == 0) { return; } int sum[3] = {0}; for(int i =0; i < backPts.size(); i++) { unsigned char* p = (unsigned char*)image->imageData + backPts[i].x * 3 + backPts[i].y*image->widthStep; sum[0] += p[0]; sum[1] += p[1]; sum[2] += p[2]; } avgBackColor[0] = sum[0]/backPts.size(); avgBackColor[1] = sum[1]/backPts.size(); avgBackColor[2] = sum[2]/backPts.size(); } // return maxflow of graph int runMaxflow(); // get result, a grayscale mast image indicating forground by 255 and background by 0 IplImage* getImageMask(); private : float colorDistance(unsigned char* color1, unsigned char* color2); float minDistance(unsigned char* color, vector<CvPoint> points); bool isPtInVector(CvPoint pt, vector<CvPoint> points); void getE1(unsigned char* color,float* energy); float getE2(unsigned char* color1,unsigned char* color2); GraphType *graph; }; LasySnapping::LasySnapping() { graph = NULL; avgForeColor[0] = 0; avgForeColor[1] = 0; avgForeColor[2] = 0; avgBackColor[0] = 0; avgBackColor[1] = 0; avgBackColor[2] = 0; } float LasySnapping::colorDistance(unsigned char* color1, unsigned char* color2) { return sqrt(((float)color1[0]-(float)color2[0])*((float)color1[0]-(float)color2[0])+ ((float)color1[1]-(float)color2[1])*((float)color1[1]-(float)color2[1])+ ((float)color1[2]-(float)color2[2])*((float)color1[2]-(float)color2[2])); } float LasySnapping::minDistance(unsigned char* color, vector<CvPoint> points) { float distance = -1; for(int i =0 ; i < points.size(); i++) { unsigned char* p = (unsigned char*)image->imageData + points[i].y * image->widthStep + points[i].x * image->nChannels; float d = colorDistance(p,color); if(distance < 0 ) { distance = d; } else { if(distance > d) { distance = d; } } } return distance; } bool LasySnapping::isPtInVector(CvPoint pt, vector<CvPoint> points) { for(int i =0 ; i < points.size(); i++) { if(pt.x == points[i].x && pt.y == points[i].y) { return true; } } return false; } void LasySnapping::getE1(unsigned char* color,float* energy) { // average distance float df = colorDistance(color,avgForeColor); float db = colorDistance(color,avgBackColor); // min distance from background points and forground points // float df = minDistance(color,forePts); // float db = minDistance(color,backPts); energy[0] = df/(db+df); energy[1] = db/(db+df); } float LasySnapping::getE2(unsigned char* color1,unsigned char* color2) { const float EPSILON = 0.01; float lambda = 100; return lambda/(EPSILON+ (color1[0]-color2[0])*(color1[0]-color2[0])+ (color1[1]-color2[1])*(color1[1]-color2[1])+ (color1[2]-color2[2])*(color1[2]-color2[2])); } int LasySnapping::runMaxflow() { const float INFINNITE_MAX = 1e10; int indexPt = 0; for(int h = 0; h < image->height; h ++) { unsigned char* p = (unsigned char*)image->imageData + h *image->widthStep; for(int w = 0; w < image->width; w ++) { // calculate energe E1 float e1[2]={0}; if(isPtInVector(cvPoint(w,h),forePts)) { e1[0] =0; e1[1] = INFINNITE_MAX; } else if (isPtInVector(cvPoint(w,h),backPts)) { e1[0] = INFINNITE_MAX; e1[1] = 0; } else { getE1(p,e1); } // add node graph->add_node(); graph->add_tweights(indexPt, e1[0],e1[1]); // add edge, 4-connect if(h > 0 && w > 0) { float e2 = getE2(p,p-3); graph->add_edge(indexPt,indexPt-1,e2,e2); e2 = getE2(p,p-image->widthStep); graph->add_edge(indexPt,indexPt-image->width,e2,e2); } p+= 3; indexPt ++; } } return graph->maxflow(); } IplImage* LasySnapping::getImageMask() { IplImage* gray = cvCreateImage(cvGetSize(image),8,1); int indexPt =0; for(int h =0; h < image->height; h++) { unsigned char* p = (unsigned char*)gray->imageData + h*gray->widthStep; for(int w =0 ;w <image->width; w++) { if (graph->what_segment(indexPt) == GraphType::SOURCE) { *p = 0; } else { *p = 255; } p++; indexPt ++; } } return gray; } // global vector<CvPoint> forePts; vector<CvPoint> backPts; int currentMode = 0;// indicate foreground or background, foreground as default CvScalar paintColor[2] = {CV_RGB(0,0,255),CV_RGB(255,0,0)}; IplImage* image = NULL; char* winName = "lazySnapping"; IplImage* imageDraw = NULL; const int SCALE = 4; void on_mouse( int event, int x, int y, int flags, void* ) { if( event == CV_EVENT_LBUTTONUP ) { if(backPts.size() == 0 && forePts.size() == 0) { return; } LasySnapping ls; IplImage* imageLS = cvCreateImage(cvSize(image->width/SCALE,image->height/SCALE), 8,3); cvResize(image,imageLS); ls.setImage(imageLS); ls.setBackgroundPoints(backPts); ls.setForegroundPoints(forePts); ls.runMaxflow(); IplImage* mask = ls.getImageMask(); IplImage* gray = cvCreateImage(cvGetSize(image),8,1); cvResize(mask,gray); // edge cvCanny(gray,gray,50,150,3); IplImage* showImg = cvCloneImage(imageDraw); for(int h =0; h < image->height; h ++) { unsigned char* pgray = (unsigned char*)gray->imageData + gray->widthStep*h; unsigned char* pimage = (unsigned char*)showImg->imageData + showImg->widthStep*h; for(int width =0; width < image->width; width++) { if(*pgray++ != 0 ) { pimage[0] = 0; pimage[1] = 255; pimage[2] = 0; } pimage+=3; } } cvSaveImage("t.bmp",showImg); cvShowImage(winName,showImg); cvReleaseImage(&imageLS); cvReleaseImage(&mask); cvReleaseImage(&showImg); cvReleaseImage(&gray); } else if( event == CV_EVENT_LBUTTONDOWN ) { } else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON)) { CvPoint pt = cvPoint(x,y); if(currentMode == 0) {//foreground forePts.push_back(cvPoint(x/SCALE,y/SCALE)); } else {//background backPts.push_back(cvPoint(x/SCALE,y/SCALE)); } cvCircle(imageDraw,pt,2,paintColor[currentMode]); cvShowImage(winName,imageDraw); } } int main(int argc, char** argv) { //if(argc != 2) //{ // cout<<"command : lazysnapping inputImage"<<endl; // return 0; // } string image_name; cout<<"input image name: "<<endl; cin>>image_name; cvNamedWindow(winName,1); cvSetMouseCallback( winName, on_mouse, 0); image = cvLoadImage(image_name.c_str(),CV_LOAD_IMAGE_COLOR); imageDraw = cvCloneImage(image); cvShowImage(winName, image); for(;;) { int c = cvWaitKey(0); c = (char)c; if(c == 27) {//exit break; } else if(c == 'r') {//reset image = cvLoadImage(image_name.c_str(),CV_LOAD_IMAGE_COLOR); imageDraw = cvCloneImage(image); forePts.clear(); backPts.clear(); currentMode = 0; cvShowImage(winName, image); } else if(c == 'b') {//change to background selection currentMode = 1; }else if(c == 'f') {//change to foreground selection currentMode = 0; } } cvReleaseImage(&image); cvReleaseImage(&imageDraw); return 0; }

由漢字生成圖片

AddChinese.cpp

#include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "CvxText.h" #pragma comment(lib,"freetype255d.lib") #pragma comment(lib,"opencv_core2410d.lib") #pragma comment(lib,"opencv_highgui2410d.lib") #pragma comment(lib,"opencv_imgproc2410d.lib") using namespace std; using namespace cv; #define ROW_BLOCK 2 #define COLUMN_Block 2 writePng.cpp : 定義控制臺應用程序的入口點。 int run_test_png(Mat &mat,string image_name) { /*采用自己設置的參數來保存圖片*/ //Mat mat(480, 640, CV_8UC4); //createAlphaMat(mat); vector<int> compression_params; compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); compression_params.push_back(9); //png格式下,默認的參數為3. try { imwrite(image_name, mat, compression_params); } catch (runtime_error& ex) { fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what()); return 1; } fprintf(stdout, "Saved PNG file with alpha data.\n"); waitKey(0); return 0; } int coloured(Mat &template_src, Mat &mat_png, CvScalar color) { for (int i = 0; i < template_src.rows; ++i) { for (int j = 0; j < template_src.cols; ++j) { Vec4b& bgra = mat_png.at<Vec4b>(i, j); //int temp = template_src.at<uchar>(i,j); if (template_src.at<uchar>(i,j)== 0) { bgra[0] = color.val[0]; //b通道 bgra[1] = color.val[1]; //g通道 bgra[2] = color.val[2]; //r通道 bgra[3] = 255;//alpha通道全部設置為透明完全透明為0,否則為255 } else { bgra[3] = 0;//alpha通道全部設置為透明完全透明為0,否則為255 } } } return 0; } void ImageBinarization(IplImage *src) { /*對灰度圖像二值化,自適應門限threshold*/ int i,j,width,height,step,chanel,threshold; /*size是圖像尺寸,svg是灰度直方圖均值,va是方差*/ float size,avg,va,maxVa,p,a,s; unsigned char *dataSrc; float histogram[256]; width = src->width; height = src->height; dataSrc = (unsigned char *)src->imageData; step = src->widthStep/sizeof(char); chanel = src->nChannels; /*計算直方圖并歸一化histogram*/ for(i=0; i<256; i++) histogram[i] = 0; for(i=0; i<height; i++) for(j=0; j<width*chanel; j++) { histogram[dataSrc[i*step+j]-'0'+48]++; } size = width * height; for(i=0; i<256; i++) histogram[i] /=size; /*計算灰度直方圖中值和方差*/ avg = 0; for(i=0; i<256; i++) avg += i*histogram[i]; va = 0; for(i=0; i<256; i++) va += fabs(i*i*histogram[i]-avg*avg); /*利用加權最大方差求門限*/ threshold = 20; maxVa = 0; p = a = s = 0; for(i=0; i<256; i++) { p += histogram[i]; a += i*histogram[i]; s = (avg*p-a)*(avg*p-a)/p/(1-p); if(s > maxVa) { threshold = i; maxVa = s; } } /*二值化*/ for(i=0; i<height; i++) for(j=0; j<width*chanel; j++) { if(dataSrc[i*step+j] > threshold) dataSrc[i*step+j] = 255; else dataSrc[i*step+j] = 0; } } Mat binaryzation(Mat &src) { Mat des_gray(src.size(),CV_8UC1); cvtColor(src,des_gray,CV_BGR2GRAY); //Mat bin_mat(); IplImage temp(des_gray); ImageBinarization(&temp); //threshold(des_gray,des_gray,150,255,THRESH_BINARY); imshow("二值圖像",des_gray); return des_gray; } int generate_chinese(const int size_zi, const char *msg ,int number,CvScalar color) { //int size_zi = 50;//字體大小 CvSize czSize; //目標圖像尺寸 float p = 0.5; CvScalar fsize; //讀取TTF字體文件 CvxText text("simhei.ttf"); //設置字體屬性 字體大小/空白比例/間隔比例/旋轉角度 fsize = cvScalar(size_zi, 1, 0.1, 0); text.setFont(NULL, &fsize, NULL, &p); czSize.width = size_zi*number; czSize.height = size_zi; //加載原圖像 IplImage* ImageSrc = cvCreateImage(czSize,IPL_DEPTH_8U,3);//cvLoadImage(Imagename, CV_LOAD_IMAGE_UNCHANGED); //Mat image(ImageSrc); //createAlphaMat(image); //ImageSrc = ? //IplImage temp(image); //ImageSrc = &temp; //設置原圖像文字 text.putText(ImageSrc, msg, cvPoint(1, size_zi), color); //顯示原圖像 cvShowImage("原圖", ImageSrc); string hanzi = msg; hanzi = hanzi + ".png"; Mat chinese(ImageSrc,true); Mat gray = binaryzation(chinese); imwrite("chinese_gray.jpg",gray); Mat mat_png(chinese.size(),CV_8UC4); coloured(gray,mat_png,color); run_test_png(mat_png,hanzi); // cvSaveImage("hanzi.jpg",reDstImage); //run_test_png(chinese,hanzi); //等待按鍵事件 cvWaitKey(); return 0; } int main() { CvScalar color = CV_RGB(0,0,0); int size = 200; const char* msg = "你好a";//暫時一行字不要太長 int number = 3;//字符個數 generate_chinese(size,msg,number,color); return 0; }

總結

以上是生活随笔為你收集整理的opencv图像处理常用完整示例代码总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91精品在线免费观看视频 | 精品久久久久国产免费第一页 | 黄色视屏在线免费观看 | 国产精品99久久久久久宅男 | 在线中文字幕av观看 | 99久久久国产精品免费99 | 99久久夜色精品国产亚洲 | 色婷婷欧美 | 热久久影视| 免费在线观看国产精品 | 国内外激情视频 | 亚洲高清视频在线播放 | 久久精品波多野结衣 | 精品国产一区二区三区免费 | 亚洲一级片免费观看 | 99爱国产精品 | 三级小视频在线观看 | 国产a精品| 国产一区二区久久久久 | 日韩有码在线观看视频 | 亚洲精品中文在线 | 免费日韩av电影 | 久久9999久久免费精品国产 | 91系列在线观看 | 婷婷亚洲综合 | av亚洲产国偷v产偷v自拍小说 | 综合网婷婷 | 国模吧一区 | 色婷婷在线观看视频 | 欧美午夜精品久久久久久孕妇 | 99看视频在线观看 | 亚洲成人免费观看 | 国产精品久久久久久久久久久久久 | 成人久久精品视频 | 中文字幕亚洲精品在线观看 | 中文字幕av全部资源www中文字幕在线观看 | jizz欧美性9 国产一区高清在线观看 | 亚洲精品永久免费视频 | 国产精品午夜av | 免费男女羞羞的视频网站中文字幕 | 日产乱码一二三区别免费 | 又紧又大又爽精品一区二区 | 在线观看免费成人av | 日韩91av| 国产一级片免费播放 | 高清不卡免费视频 | 91成品人影院 | 国产三级精品在线 | 亚州精品成人 | 免费黄色在线播放 | 成人午夜电影网 | 在线观看黄网站 | 色视频在线免费 | 日韩中文字幕网站 | 免费国产在线精品 | 夜夜夜夜爽 | 男女全黄一级一级高潮免费看 | 美女视频又黄又免费 | 人人狠狠综合久久亚洲婷 | 久久不射网站 | 亚洲天堂网在线观看视频 | 久久久久久99精品 | 国产成人精品亚洲a | 69xx视频 | 久久久久久久国产精品影院 | 98久9在线 | 免费 | 麻豆国产精品va在线观看不卡 | 日韩在线免费播放 | 免费韩国av | 97夜夜澡人人双人人人喊 | 亚洲最新视频在线 | 亚洲国产影院 | 国产日产欧美在线观看 | 91九色成人 | 青春草免费视频 | 免费韩国av | 精品在线观看一区二区三区 | 中文字幕高清免费日韩视频在线 | 九色91在线 | 一区二区三区 中文字幕 | 免费中文字幕 | 日韩影视在线 | 成人免费影院 | 久久久免费毛片 | 国产人成免费视频 | 亚洲区色 | 亚洲视频在线看 | 黄网站色视频免费观看 | 91av观看| 黄色在线观看免费 | 国际精品久久久久 | 欧美精品999| 国产精品久久久久久久久搜平片 | 日韩电影在线一区 | 久久久国产一区二区三区四区小说 | 日韩av中文在线 | 91精品国产综合久久久久久久 | 日韩二区三区在线观看 | 天天操天天草 | 亚洲影视资源 | 国产不卡视频在线播放 | 国产成人精品一区二区三区在线 | 99视频导航| 天天色综合天天 | 九色在线 | 超碰电影在线观看 | 亚洲免费不卡 | 97视频久久久 | 久热超碰| 99久久精品日本一区二区免费 | 欧美日韩国产精品一区 | 免费大片黄在线 | 国产一级黄 | 在线观看免费黄色 | 亚洲成人午夜av | 欧美日韩高清不卡 | 中文字幕在线观看免费高清完整版 | 久久久资源 | 国产午夜一区二区 | 中文字幕乱码电影 | 日韩在线视频不卡 | 久久99国产精品免费 | 国产黄色播放 | 亚洲成aⅴ人在线观看 | 五月婷婷在线观看 | av观看在线观看 | 成人黄色av免费在线观看 | 999抗病毒口服液 | 日韩精品中文字幕在线 | 天天插综合 | 黄色影院在线播放 | 日韩高清精品免费观看 | 国产精品久久久久久久午夜 | 国产精品久久久久久久久搜平片 | 日日草视频 | 欧美色图亚洲图片 | 国产黄色一级大片 | 亚洲精品国产自产拍在线观看 | 国产精品2018| 99精彩视频在线观看免费 | 亚洲精品伦理在线 | 成人va天堂| 亚洲国产精品99久久久久久久久 | 91成人短视频在线观看 | 久久久九色精品国产一区二区三区 | 色狠狠久久av五月综合 | 日韩在线不卡视频 | 日韩在线观看免费 | www.五月天激情 | 精品极品在线 | 日本性久久 | 国产一区二区高清不卡 | 黄色av三级在线 | 国产精品一区二区三区四区在线观看 | 日韩区欠美精品av视频 | 国产中文字幕av | 国产 亚洲 欧美 在线 | 91精品免费 | 99视频精品免费视频 | 国产a国产 | 国产不卡精品 | 69av久久| 97精品国产91久久久久久 | 免费观看的黄色片 | 国产日韩欧美视频在线观看 | 97偷拍在线视频 | 日韩一区二区三区免费视频 | 亚洲精品一区中文字幕乱码 | 热久久国产精品 | 欧美男女爱爱视频 | 午夜婷婷综合 | 美女视频网站久久 | 国产一区二区视频在线播放 | 天堂网中文在线 | 国产精品成人久久久 | 免费看国产视频 | 亚洲伊人天堂 | 性色av免费看 | 国产精品久久久久永久免费 | 亚洲高清91 | 成年人免费在线观看网站 | 国产成人精品一区一区一区 | 五月天亚洲综合小说网 | 国产r级在线观看 | 在线国产观看 | 99热在线这里只有精品 | 婷婷久久五月 | 国语精品免费视频 | 亚洲精品视| 日韩专区av| 少妇bbb搡bbbb搡bbbb | 久久一本综合 | 日韩精品视频在线免费观看 | 国产精品久久久久久一二三四五 | 久久久性 | 五月天婷婷在线播放 | 色播六月天 | 色狠狠综合天天综合综合 | 在线成人免费电影 | 9草在线 | 在线观看黄色的网站 | 国产综合婷婷 | 狠狠的干 | 日韩特黄一级欧美毛片特黄 | 92精品国产成人观看免费 | 国产黄色片久久久 | 天天色天天干天天色 | 亚洲色图色| 伊人手机在线 | 伊人天堂网 | 欧美日韩国产网站 | 国内三级在线观看 | 97超级碰碰碰碰久久久久 | 国产麻豆剧果冻传媒视频播放量 | 欧美色噜噜噜 | 国产精品入口麻豆www | 黄色在线观看污 | www一起操| 免费一级日韩欧美性大片 | 天天天操天天天干 | 免费的国产精品 | 黄色三级在线观看 | 免费观看全黄做爰大片国产 | 免费国产一区二区视频 | 久久免费视频99 | 亚洲国产网站 | 中文字幕在线日 | 午夜 免费 | 中文字幕五区 | 亚洲另类久久 | 五月综合久久 | 久久久久久片 | 91精品视频免费观看 | 色综合久久99 | 美女黄频网站 | av片在线看 | 久久国产精品网站 | 久久最新网址 | 国产精品爽爽久久久久久蜜臀 | 色91在线| 久久国产精品久久精品 | 国产中文字幕第一页 | av电影免费在线播放 | 久久国产精品免费一区二区三区 | 欧美性护士 | 免费三级黄色 | 天天激情天天干 | 久草在线手机视频 | 亚洲成av人片一区二区梦乃 | 五月婷香| 中文字幕精品一区久久久久 | 91在线观看黄 | 午夜精品一区二区三区四区 | 亚洲精品视频网 | 美女网站视频色 | 天天干.com | 最近更新中文字幕 | av电影一区 | 在线看片成人 | 国产精品久久久久久999 | 91九色蝌蚪视频 | av网站在线观看免费 | 香蕉视频网址 | 国产精品资源 | 久久69av| 啪啪av在线 | 久久久精品免费看 | 成人91免费视频 | 久久超级碰视频 | 天天拍天天爽 | 成人av免费 | 中文字幕一区二区三区乱码不卡 | 男女拍拍免费视频 | 特级片免费看 | 国产视频精品久久 | 中文字幕av最新更新 | 国产va饥渴难耐女保洁员在线观看 | 91免费看黄 | 亚洲成人精品影院 | 国产在线黄色 | 久久久.com| 久久精品—区二区三区 | 香蕉视频在线观看免费 | 人人视频网站 | 911国产 | 天天操天天射天天爽 | 天天操天天色天天射 | 日本夜夜草视频网站 | 激情深爱 | 日本免费一二三区 | 91精品第一页 | 久久网址 | 亚洲国产婷婷 | japanesexxxxfreehd乱熟| 91视频麻豆视频 | 免费看毛片在线 | 亚洲免费黄色 | 国产高清不卡av | 人人插人人艹 | 亚洲最新视频在线 | 最新日韩中文字幕 | 亚洲精品国产精品国产 | 国产一区视频在线 | 国产a高清 | 国产精品久久在线观看 | 久草网在线观看 | 福利视频第一页 | 婷婷五天天在线视频 | 久久精品99久久久久久 | 久久人人爽视频 | 久久久久久欧美二区电影网 | 亚洲日b视频 | 国产第一页在线播放 | 天天干天天操天天操 | 精品国产电影 | 久久久美女| 91成人免费看 | 最近中文字幕在线播放 | 亚洲少妇天堂 | 欧美另类色图 | 欧美日韩免费视频 | 国产又粗又硬又长又爽的视频 | 激情www | 91精品久久香蕉国产线看观看 | 成人av在线直播 | 99热这里只有精品在线观看 | 国产高清日韩欧美 | 中文字幕成人 | ww视频在线观看 | 国产美女被啪进深处喷白浆视频 | 黄色片亚洲 | 精品美女久久久久久免费 | 国产亚洲成人网 | 日韩免费久久 | 精品一区91 | 米奇四色影视 | av经典在线 | 亚洲成人午夜av | 麻豆国产在线播放 | 久草青青在线观看 | 九色最新网址 | 人人涩 | 性色视频在线 | 国产最新精品视频 | 久久玖 | 亚洲三级性片 | 久久精品这里都是精品 | 午夜成人免费影院 | 日韩av一区二区在线播放 | 精品国产成人av在线免 | av综合站 | av色综合 | 中文字幕888 | 久久久久久久久黄色 | 操处女逼 | 日韩免费视频观看 | www.xxxx欧美| 国产精品成人一区二区三区吃奶 | 国产1级毛片 | 国产视频亚洲视频 | 在线成人看片 | 免费日p视频 | 亚洲视频99 | 天天久久综合 | 激情网五月婷婷 | 精品美女久久久久久免费 | 最近中文字幕完整视频高清1 | 超薄丝袜一二三区 | 国产日韩在线视频 | 奇米先锋 | 天天干天天射天天操 | av软件在线观看 | 五月婷婷综合激情网 | 亚洲精品在线免费观看视频 | 国产1级毛片 | 欧美精品亚洲二区 | 一区二精品 | 国产精品免费一区二区三区 | 欧美激情亚洲综合 | 久久xxxx| 欧美日韩一区二区久久 | 国产成人在线精品 | 91国内在线视频 | 91桃色国产在线播放 | 日韩理论片在线 | 成人在线观看网址 | 日本黄网站 | 日韩欧美高清不卡 | 免费在线观看av不卡 | 国产伦精品一区二区三区… | 69久久久久久久 | 日韩在线视频免费观看 | 国产.精品.日韩.另类.中文.在线.播放 | 热re99久久精品国产66热 | www日| 免费福利在线视频 | 欧美一区二区三区免费观看 | 日韩精品欧美一区 | 国产精品第2页 | 国产精品美女久久久网av | 国产一级电影网 | 激情丁香在线 | 精品亚洲二区 | 国产亚洲va综合人人澡精品 | 午夜精品久久久 | 91av免费在线观看 | 久久免费成人 | 又爽又黄在线观看 | 美女黄视频免费 | 欧美性色网站 | 久久最新视频 | 成人网页在线免费观看 | 天堂在线v | 日本大片免费观看在线 | 亚洲五月婷婷 | 日日狠狠 | 精品久久久影院 | 久久在线观看视频 | 亚洲精品在线视频播放 | 久久久99久久 | 亚洲综合在线播放 | 久99久精品视频免费观看 | 中文字幕在线播放日韩 | 久久精品国产精品亚洲 | 美女黄色网在线播放 | 久草视频观看 | 一级做a爱片性色毛片www | 色偷偷88888欧美精品久久久 | 国产黄色片免费观看 | 麻豆视频免费版 | 在线观看国产高清视频 | 在线观看一区二区精品 | 2024av| 综合婷婷久久 | 婷婷激情综合五月天 | 国产精品毛片久久久 | 欧美成年人在线视频 | 亚洲 欧洲 国产 精品 | 国产高清av在线播放 | 99精品免费久久久久久久久 | 日韩视频免费 | 亚洲综合欧美日韩狠狠色 | 亚洲无线视频 | 日韩激情久久 | 日本夜夜草视频网站 | 在线观看www. | 99久久激情视频 | 伊人久久电影网 | 日本公妇在线观看高清 | 一级片在线| 天天摸天天操天天舔 | 天天射天天射 | 国产午夜精品一区二区三区在线观看 | 亚洲精品456在线播放第一页 | 久久影视网 | 国产成人精品一区二区三区免费 | 天天天操天天天干 | 久久精品免视看 | av导航福利| 久久免费精品国产 | 天天摸天天舔天天操 | 国产精品岛国久久久久久久久红粉 | 精品免费在线视频 | 91女子私密保健养生少妇 | 在线看v片 | 国产视频中文字幕在线观看 | 国产在线观看91 | 99r在线观看| 黄色在线观看www | 久久亚洲美女 | 国产精品乱码高清在线看 | 美女久久久久久久久久久 | 视频在线观看91 | 蜜臀91丨九色丨蝌蚪老版 | 国产综合片 | av成人黄色| 国产色视频一区二区三区qq号 | 欧美国产日韩一区二区三区 | 亚洲天堂精品视频 | 在线97| 日韩av视屏在线观看 | 在线免费高清 | 色网址99 | av福利资源 | 亚洲成人av在线播放 | 伊人婷婷色 | 日日色综合| 国产黄色片免费在线观看 | 久章草在线 | 日产乱码一二三区别在线 | 天堂av在线网址 | 国产免费亚洲 | 一区二区三区视频在线 | 看片一区二区三区 | 日韩久久久久 | 超碰在线1 | 在线免费视| 97国产精品亚洲精品 | 国产精品日韩高清 | 在线欧美小视频 | 久久久久久免费视频 | 欧美一级在线观看视频 | 日本性xxx| 日韩夜夜爽 | 久久激情日本aⅴ | 日韩av电影网站在线观看 | 91av视频在线免费观看 | 精品久久久久久久久久久久久 | 亚洲免费av网站 | 久久免费观看视频 | 免费成人黄色片 | 欧美一级日韩免费不卡 | 中文字幕视频 | 国产精品久久久久久久久久 | 国产精品婷婷 | 欧美精品在线视频观看 | 国产亚洲精品无 | 日本久草电影 | 国产男女爽爽爽免费视频 | 国产成人av网址 | av日韩中文| 国产精品精品久久久久久 | 久久精品综合 | 亚洲国产中文在线观看 | 国产福利久久 | 免费久久片 | 韩国中文三级 | 三级av在线播放 | 日韩精品一区二区免费视频 | 91女神的呻吟细腰翘臀美女 | 亚洲经典中文字幕 | 中文字幕欧美三区 | 国产亚洲va综合人人澡精品 | 国产精品一区二区三区视频免费 | 国产色综合天天综合网 | 亚洲专区 国产精品 | 天天操夜夜操 | 成人免费观看网站 | 久久99日韩 | 久久久久激情电影 | 狠狠色丁香久久婷婷综合五月 | 成人av网站在线观看 | 激情综合色综合久久综合 | 在线黄色免费av | 国产精品永久免费在线 | 91在线视频 | 成人不用播放器 | 91爱爱视频| 国产91丝袜在线播放动漫 | 97超碰超碰久久福利超碰 | 欧美日韩另类在线观看 | 欧美一二在线 | 精品一区在线 | 国产精品网红直播 | 日本三级久久久 | 久久人人做 | 天天插综合 | 黄色免费观看网址 | 日韩在线观看视频中文字幕 | 亚洲小视频在线观看 | 中文字幕免费高清 | 日韩欧美精品在线观看 | 97夜夜澡人人爽人人免费 | 国产精品久久久网站 | av网站免费在线 | 一区二区三区四区在线免费观看 | 免费日韩视 | 一区二区精品视频 | 夜夜夜影院 | av一级片在线观看 | 色诱亚洲精品久久久久久 | 在线免费观看黄网站 | 日韩精品一区二区三区免费观看 | 四虎影视国产精品免费久久 | 操操操日日日 | 天天射色综合 | 免费在线看成人av | 91国内在线 | 中文字幕在线观看视频免费 | 国产精品久久久久久久久久直播 | 国产91全国探花系列在线播放 | 久久久久久片 | 国内揄拍国内精品 | 亚洲精品色视频 | 99久久精品国产毛片 | 日韩视频一区二区在线 | 久草在线最新免费 | 久草精品视频在线播放 | 99精品影视 | 日日夜夜天天射 | 精品久久一区 | 九九亚洲视频 | 91爱看片 | 亚洲免费在线 | 久久久亚洲国产精品麻豆综合天堂 | 热久久免费视频精品 | 狠狠干免费| 国产视 | 中文字幕一区二区在线观看 | 99av国产精品欲麻豆 | 一级片免费在线 | 亚洲国产成人久久 | 久久无码精品一区二区三区 | 久久久999 | 福利视频一区二区 | 精品91| 国产精品9999久久久久仙踪林 | 国产成人精品亚洲a | av免费观看高清 | 欧美日韩高清在线观看 | www.com黄 | 亚洲国产成人精品久久 | av一级片在线观看 | 在线播放视频一区 | 少妇视频一区 | 国产破处在线视频 | 日日天天av | 欧美日韩亚洲精品在线 | 日韩av在线一区二区 | 亚洲国产欧美在线看片xxoo | 91 在线视频播放 | 91亚洲精品在线 | 亚洲成人国产精品 | 国产一区二区三区免费在线观看 | 91中文字幕网| 国内精品久久久久影院一蜜桃 | 国产999精品久久久久久麻豆 | 亚洲国产合集 | 啪啪凸凸| 4438全国亚洲精品在线观看视频 | 成人免费大片黄在线播放 | 国产精品99久久久久久久久 | 人人澡超碰碰 | 狠狠干电影| av色图天堂网| 99热这里有 | 精品女同一区二区三区在线观看 | 天天干天天综合 | 亚洲精品五月天 | 麻豆久久久| 国产精品99久久久久久武松影视 | 欧美日韩精品在线观看视频 | 国产91国语对白在线 | 超碰av在线播放 | 三级在线视频播放 | 免费a级观看 | 日韩视频免费观看高清完整版在线 | 97电影手机 | av免费观看网址 | 国产成人精品av在线 | 女人18片| 欧美色图亚洲图片 | 男女啪啪免费网站 | 国产精品美女视频网站 | 超碰国产在线观看 | 中文在线中文资源 | 国内成人精品2018免费看 | 欧美日韩不卡在线 | 激情婷婷六月 | 亚洲人在线7777777精品 | 国产精品美女久久久久久免费 | 国产自产在线视频 | 亚洲影视九九影院在线观看 | 国产精品毛片久久久久久 | 亚洲午夜久久久久久久久 | 精品一区二区三区久久 | 亚洲在线色| 日本精品久久久久久 | 97超视频 | 国产在线毛片 | 麻豆国产视频 | 91成人免费看 | 在线不卡的av | 日韩电影一区二区三区在线观看 | 中文字幕精品三区 | 三级av片| 欧美性生活大片 | 在线观看深夜视频 | 久久国产亚洲精品 | 国产精品久久久 | 亚洲欧美日韩一二三区 | 日韩欧在线 | 91成人看片 | 国产成人综合图片 | 99中文字幕在线观看 | 91亚洲夫妻 | 免费观看一区二区三区视频 | 天天操天天添 | 日日干,天天干 | 97超碰国产精品女人人人爽 | 日韩欧美精品在线 | 久热色超碰 | 超碰在线cao | 色网站免费在线观看 | 免费色黄 | 99国产精品久久久久老师 | 高清av中文在线字幕观看1 | av视屏在线播放 | 国产精品一区二区果冻传媒 | av三级在线免费观看 | 久久国产影院 | av丝袜美腿| 亚洲在线网址 | 久久综合九色综合97婷婷女人 | aⅴ精品av导航 | 国产小视频网站 | 欧美色图狠狠干 | 天天干国产 | 人人插人人做 | 国产日韩欧美在线 | 国产精品18久久久久久久久 | 久久久久| 黄色日本片 | 丁香婷婷综合激情五月色 | 日韩精品高清不卡 | 亚洲国产精品电影 | 免费看黄在线 | 激情文学丁香 | 成人av教育 | 国产福利小视频在线 | 午夜精品一区二区三区在线视频 | 女人18毛片a级毛片一区二区 | 99在线精品视频在线观看 | 日韩网站在线看片你懂的 | 欧美日韩91 | 中文字幕丰满人伦在线 | 日日日操操 | 碰超人人 | 成人四虎影院 | 亚洲综合最新在线 | 国产精品精品久久久久久 | 亚洲五月婷 | 亚洲免费成人av电影 | 久久网页| 日日夜夜狠狠干 | 久久婷婷丁香 | 人人插人人爱 | 天天干天天插 | 一级做a爱片性色毛片www | 日韩一级成人av | 久久97精品 | 国产精品久久在线观看 | 日韩午夜大片 | 国内精自线一二区永久 | 欧美另类巨大 | 国产精品乱码久久久久 | 色偷偷中文字幕 | 在线观看 亚洲 | 日韩欧美国产激情在线播放 | 91精品视频观看 | av高清一区二区三区 | 草久久精品 | av综合站| 日韩三区在线观看 | 91av网址 | 欧美日韩三级 | 夜夜骑日日操 | 日本一区二区不卡高清 | 免费一级黄色 | 亚洲黄色免费 | 成人在线观看资源 | 免费黄色激情视频 | 亚洲一区免费在线 | 四虎成人精品永久免费av | 国产精品视频内 | 综合在线观看 | 日韩视频免费观看高清 | 超级碰碰免费视频 | 精品一区91 | 久久资源在线 | 91av在线免费| 五月天久久久 | 亚洲 中文 在线 精品 | 99热99re6国产在线播放 | 免费亚洲电影 | 九九免费在线观看 | 国产一二三精品 | 日韩一区在线免费观看 | 成人小视频在线观看免费 | 免费一级日韩欧美性大片 | 久久成人资源 | 91在线欧美 | 亚洲精品美女久久17c | 久久好看| 成人黄色在线 | 综合精品久久久 | 亚洲精品一区二区18漫画 | 久久久久亚洲精品成人网小说 | 亚洲性xxxx| 天天躁日日躁狠狠 | 欧美性另类 | 婷婷狠狠操 | 色婷婷 亚洲 | 久久五月网| 首页国产精品 | 97在线观看免费观看高清 | 国产亚洲精品成人av久久影院 | 精品国产一区二区三区久久久 | 黄色三级免费 | 91福利小视频| 久久久久亚洲精品中文字幕 | 日韩免费在线看 | 国产精品1区 | 胖bbbb搡bbbb擦bbbb| 久久免费99| 久久九九影视网 | 天堂激情网 | 日韩在线免费播放 | 成年人在线电影 | 91亚洲夫妻 | 精品国产一区在线观看 | 天天操天天弄 | 国产精品手机播放 | 在线看片成人 | 国产精品成人品 | 啪啪资源 | 一本色道久久综合亚洲二区三区 | 久久久久免费精品国产小说色大师 | 婷婷伊人综合亚洲综合网 | 91成人免费电影 | 欧美最猛性xxxx | 国产精品久久人 | 欧美成人黄色片 | 西西44人体做爰大胆视频 | 中文字幕一区在线 | 欧美精品一级视频 | 91在线视频免费观看 | 婷婷久久一区二区三区 | 婷色在线 | 婷婷资源站 | 欧美视频在线观看免费网址 | 日韩欧美99 | 三级黄免费看 | 少妇高潮冒白浆 | wwwwww国产| 天天爱天天草 | 91少妇精拍在线播放 | 国产精品18videosex性欧美 | 亚洲精品视频网 | 国内三级在线观看 | 香蕉视频最新网址 | 99久久精品免费看国产麻豆 | 亚洲免费在线观看视频 | 亚洲美女视频在线 | 国产精品国产毛片 | 欧美日韩69 | 99久久网站| 久久久精品国产免费观看一区二区 | 久久人人97超碰精品888 | 色a4yy| 成人午夜片av在线看 | 成人黄色在线看 | 永久免费在线 | 国产一级电影在线 | 人人爽人人爽 | 日韩高清三区 | 精品在线小视频 | 在线a视频 | 美女免费视频观看网站 | 国产高清在线精品 | 色综合网在线 | 亚洲h色精品 | 久久伊99综合婷婷久久伊 | 人人草天天草 | 欧美激情综合五月色丁香 | 久久激情小视频 | 男女视频久久久 | 亚洲精品动漫成人3d无尽在线 | 天天插狠狠插 | 久久国产精品99国产 | 92国产精品久久久久首页 | 91网在线观看| av3级在线 | 国产又粗又猛又黄 | 最近中文字幕视频完整版 | 天天爽夜夜操 | 亚洲国产精品人久久电影 | 黄色软件视频大全免费下载 | 手机在线看永久av片免费 | 99免费在线观看视频 | 色香com. | 亚洲伦理中文字幕 | 日日操狠狠干 | 99人久久精品视频最新地址 | 狠狠撸电影 | 欧美伦理电影一区二区 | 香蕉91视频 | 亚洲热久久| 欧美日韩精品区 | 美女国产精品 | 婷婷六月综合网 | 色之综合网 | 91色在线观看 | 999久久久精品视频 日韩高清www | 国产一区免费看 | 黄色毛片视频免费 | 国产精品免费高清 | 久久情爱| 成片免费观看视频 | 久久国产精品一二三区 | 国产日产在线观看 | 国产精品va最新国产精品视频 | 国产在线观看一区 | 欧美 日韩 性 | 国产黄色一级大片 | 一区二区精 | 久久久久久久久久网站 | 97超碰人人澡人人 | 麻豆小视频在线观看 | 97超碰网 | 韩国视频一区二区三区 | www.狠狠插.com | 久久理论电影网 | 日日夜夜噜噜噜 | 国产日产欧美在线观看 | 天天曰天天干 | 免费在线观看污网站 | 国产精品第52页 | 欧美三人交 | 亚洲理论影院 | 日韩大片在线观看 | 国产精品福利视频 | 人人讲下载| 国际精品久久久久 | 日本精品视频在线播放 | 欧美日韩国产一区二区在线观看 | 偷拍精偷拍精品欧洲亚洲网站 | 国产成人一区在线 | 九九热中文字幕 | 亚洲 欧美 综合 在线 精品 | av成人在线观看 | 亚洲人人网 | 日韩羞羞 | 91精品国产92久久久久 | 成人免费色 | 91中文字幕| 永久免费观看视频 | 高潮久久久久久久久 | 999久久国精品免费观看网站 | 国产区第一页 | 日韩免费看 | 夜色资源网| 久久久久久国产精品久久 | 久久电影色 | 久久久免费观看完整版 | 国产91精品久久久久久 | 91片黄在线观| 91久久国产露脸精品国产闺蜜 | 黄色小视频在线观看免费 | ww视频在线观看 | 国产在线综合视频 | 一本一本久久a久久精品综合妖精 | 国产日产精品一区二区三区四区的观看方式 | 亚洲精品电影在线 | 欧美日韩一二三四区 | 午夜影院日本 | 欧美日韩不卡一区二区三区 | 国产一级淫片在线观看 | 国产91粉嫩白浆在线观看 | 人人插人人澡 | 亚洲成人免费观看 | 婷婷色网站| 91久久影院 | 成年人在线观看免费视频 | 中文字幕免费观看视频 | 久久视频国产精品免费视频在线 | 五月开心六月伊人色婷婷 | 一本到视频在线观看 | 超碰人人在线观看 | 久久久一本精品99久久精品66 | 91精品视频网站 | 国产精品福利在线观看 | 国产精品国产三级国产不产一地 | 91漂亮少妇露脸在线播放 | 国产91小视频 | a天堂中文在线 | 美女黄色网在线播放 | 男女精品久久 | 国产成人精品不卡 | 中文在线免费看视频 | 日韩高清在线一区二区 | 亚洲精品www. | 国产精品欧美久久久久久 | 91九色综合 | 欧美国产视频在线 | 久久色视频 | 97电影院在线观看 | 97超碰人人模人人人爽人人爱 | 又色又爽又黄 | 亚洲视频每日更新 | 日韩精品一区二区免费视频 | 激情欧美日韩一区二区 | 日韩欧美国产免费播放 | 欧美二区三区91 | 国产69精品久久久久99尤 | 日日夜夜草| 国产日本在线观看 | 丁香五香天综合情 |