opencvプログラムの一部を標準関数で書きたい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: opencvプログラムの一部を標準関数で書きたい。

Re: opencvプログラムの一部を標準関数で書きたい。

#4

by usao » 6年前

マルチポストかな
https://teratail.com/questions/112525

Re: opencvプログラムの一部を標準関数で書きたい。

#3

by かずま » 6年前

comp の呼び出しと、image.cols /= 4; は、
cv::imshow("video", image); の直前で行わないと、
顔認識の結果がちゃんと表示されないでしょう。

でも、横方向に圧縮して何がしたいのでしょうか?
また、標準関数は使っていないのですが、
私が何か勘違いをしているのでしょうか?

Re: opencvプログラムの一部を標準関数で書きたい。

#2

by かずま » 6年前

screen も compress もグローバル変数で、0 に初期化されています。
screen から compress を作っても何も変わりません。

image の内容を変更しないといけないでしょう。

コード:

#include <iostream>
#include <sstream>
#include <opencv2/opencv.hpp>

using namespace std;

#define P(x) data[(y * x_size + (x)) * 3 + i]

void comp(unsigned char *data, int x_size, int y_size) {
    for (int i = 0; i < 3; i++)
        for (int y = 0; y < y_size; y++)
            for (int x = 0; x < x_size / 4; x++)
                P(x) = (P(x * 4) + P(x * 4 + 1) + P(x * 4 + 2) + P(x * 4 + 3)) / 4;
}

void doJob() {
    string path = "C:/opencv/sources/samples/winrt/FaceDetection/FaceDetection/Assets/";
    string cascadeName = "haarcascade_frontalface_alt.xml";
    cv::CascadeClassifier cascade;
    if (!cascade.load(path + cascadeName)) throw runtime_error(cascadeName + " not found");

    cv::VideoCapture cap(0);
    if (!cap.isOpened()) throw runtime_error("VideoCapture open failed");
    cv::Mat image;
    cv::Mat gray;
    while (1) {
        cap >> image;
        cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
        comp(image.data, image.cols, image.rows);       // +++
        image.cols /= 4;                                // +++
        equalizeHist(gray, gray);
        vector<cv::Rect> founds;
        cascade.detectMultiScale(gray, founds, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
        for (auto faceRect : founds) {
            cv::rectangle(image, faceRect, cv::Scalar(0, 0, 255), 2);
        }
        cv::imshow("video", image);
        auto key = cv::waitKey(1);
        if (key == 'q') break;
    }
    cv::destroyAllWindows();
}

int main() {
    try {
        doJob();
    }
    catch (exception &ex) {
        cout << ex.what() << endl;
        string s;
        cin >> s;
    }
    return 0;
}

opencvプログラムの一部を標準関数で書きたい。

#1

by CarlosCarnage » 6年前

[tabs][tabs: ]C[/tabs][tabs][tabs: ]C++[/tabs]

環境はWindows10 64ビット
visual studio 2015 community

opencvプログラムの一部を標準関数で書きたいのもcv::VideoCapture cap(0)のcap.set(cv::CAP_PROP_FRAME_WIDTH, 幅)とcap.set(cv::CAP_PROP_FRAME_HEIGHT, 高さ)を用いれば簡単なのですが、勉強のためにこの部分をopencvではなく標準関数で書きたいと思い頑張っているのですがうまくいきません。どうかお力をお貸していただけないでしょうか?
投稿が初めてゆえに間違いなどがあるかもしれませんがどうかよろしくお願いします。

コードはこちらです。

コード:

#include <iostream>
#include <sstream>
#include<stdio.h>
#include<stdlib.h>
#define X_SIZE 1916/*画像の横サイズを定義*/
#define Y_SIZE 181/*画像の縦サイズを定義*/
unsigned char screen[Y_SIZE][X_SIZE][3], compress[Y_SIZE][X_SIZE][3];

#include <opencv2/opencv.hpp>

using namespace std;

void doJob() {
	string path = "";
	string cascadeName = "haarcascade_frontalface_alt.xml";
	cv::CascadeClassifier cascade;
	if (!cascade.load(path + cascadeName)) throw runtime_error(cascadeName + " not found");

	/*サイズ変更*/
	int x, y, i;
	for (i = 0; i < 3; i++) {
		for (y = 0; y < Y_SIZE; y++) {
			for (x = 0; x < X_SIZE / 4; x++) {
				compress[y][x][i] = (screen[y][x * 4 + 0][i] + screen[y][x * 4 + 1][i] + screen[y][x * 4 + 2][i] + screen[y][x * 4 + 3][i]) / 4;
			}
		}
	}  //上のプログラム20~27が出力されるウィンドウの大きさを変えるプログラムとして書いたのですがうまく機能しませんプログラム自体は正しくコンパイルできています。//
	
	cv::VideoCapture cap(0);
	if (!cap.isOpened()) throw runtime_error("VideoCapture open failed");
	cv::Mat image;
	cv::Mat gray;
	while (1) {
		cap >> image;
		cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
		equalizeHist(gray, gray);
		vector<cv::Rect> founds;
		cascade.detectMultiScale(gray, founds, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
		for (auto faceRect : founds) {
			cv::rectangle(image, faceRect, cv::Scalar(0, 0, 255), 2);
		}
		cv::imshow("video", image);
		auto key = cv::waitKey(1);
		if (key == 'q') break;
	}
	cv::destroyAllWindows();
}

int main(int argc, char** argv) {
	try {
		doJob();
	}
	catch (exception &ex) {
		cout << ex.what() << endl;
		string s;
		cin >> s;
	}
	return 0;
}

ページトップ